【数据结构和算法初阶(c语言)】二叉树系列oj题目图文详解

目录

1.单值二叉树

2.判断两颗二叉树是否相同

3.二叉树的前序遍历

接口了解 

4.判断一棵树是不是另外一棵树的子树

5.判断一棵树是不是对称二叉树

6.二叉树遍历


1.单值二叉树

. - 力扣(LeetCode)

如果二叉树每个节点都具有相同的值,那么该二叉树就是单值二叉树。

只有给定的树是单值二叉树时,才返回 true;否则返回 false

解题思路:

先判断根和它的左右子树相等不相等,都相等再次判断左右子树和他们的孩子是否相等。(递归的思想)先判断根再判断左右子树属于前序遍历。

题解代码:

bool isUnivalTree(struct TreeNode* root) {

    //如果根为空,这里根据示例1可以返回空

    if(root ==NULL)

    {

        return true;

    }

    //根节点不为空了,现在就来看一下左右孩子的值等不等于根

    if(root->left  &&root->left->val != root->val)

    {

           return false;

    }

     //首先要判断左右孩子有没有,然后再判断两个值是否相等,左子树值与根相等,右子树值与根相等,判定三个节点的值相等。但是如果是判断值相等作为判断条件这里不能直接返回true,返回false是比较好的处理方式

     if(root->right && root->right->val != root->val)

     {

            return false;

     }


 

     //当上述都没有进入说明这一次的根左右子树是相等的,就去下一层

     return isUnivalTree(root->left)&&isUnivalTree(root->right);

     //只要一个返回false就返回false,第一个返回false就不会执行第二个

   

}

我们来看一下例子和代码的递归展开图对比:红色是向下执行,绿色是返回

2.判断两颗二叉树是否相同

. - 力扣(LeetCode)

给你两棵二叉树的根节点 p 和 q ,编写一个函数来检验这两棵树是否相同。

如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。

 

解题思想:拆分为子问题,根比较,左子树比较,再右子树比较。

bool isSameTree(struct TreeNode* p, struct TreeNode* q) {if(p==NULL&&q==NULL){return true;//如果两个都为空,返回真,这是处理到最后节点的时候,也是从根开始的比较,每一次递归的节点都可以看做是这次比较的根}if(p==NULL||q==NULL){return false;//p,q当中至少一个为空的情况,这里就是可以判断一个树有这个节点而另外一棵树没有这个节点的情况,那么这两颗树就是不一样的}//接下来判定值if(p->val!= q->val){return false;//判断值相等作为条件会麻烦一些,判断值不等}//根比较完就开始比较树的左右子树return isSameTree(p->left,q->left)&&isSameTree(p->right,q->right);//左右子树返回一个folse整体就为假
}

 

3.二叉树的前序遍历

. - 力扣(LeetCode)

给你二叉树的根节点 root ,返回它节点值的 前序 遍历。

我们先看一下这个题目给的接口,补充一些接口了解内容

接口了解 

 

第一:题目要求将打印的结果存在一个数组中,这个数组必须是malloc开辟,但是不需解题的人释放,调用者会去释放。

第二:关于returnsize:这个参数是一个记录数组大小的值,就是说这个函数被调用后我们应该给调用者返回数组的指针,同时也要让调用者能够拿到这个数组的大小方便调用者去遍历这个数组,但是,一个函数是不能够有两个返回值的,所以,这里定义一个int * 类型的指针,外部传入一个变量的地址,通过解引用修改,就可以改变调用者传递过来的这个值,然后调用者可以拿到这个数组的大小。

int Treesize(struct TreeNode* root){return root==NULL ? 0: Treesize(root->left)+Treesize(root->right)+1;}void perorder(struct TreeNode* root,int* a,int* i){if(root==NULL){return;}//不为空就将值放入数组里面a[(*i)++] = root->val;perorder(root->left,a,i);//遍历左树,这里传值1注意i已经是指针perorder(root->right,a,i);//遍历右树}
int* preorderTraversal(struct TreeNode* root, int* returnSize) {//首先开辟数组方便后面存储int n = Treesize(root);int* a = (int *)malloc(sizeof(int)*n);//这里我们的空间开辟多大,不能盲目指定,开辟大了浪费空间,开辟小了不够,relloc多了会导致内存之间空隙太多,也不是很好,这里我们就根据数的大小来确定所以我们先求一下树的大小。//进行前序遍历int i =0;perorder(root,a,&i);//这里传数组下标使用的是传地址,防止递归过程中有时不会发生下标值的改变造成失误*returnSize= n;//返回数组的大小return a;//返回a
}

4.判断一棵树是不是另外一棵树的子树

. - 力扣(LeetCode)

给你两棵二叉树 root 和 subRoot 。检验 root 中是否包含和 subRoot 具有相同结构和节点值的子树。如果存在,返回 true ;否则,返回 false 。

二叉树 tree 的一棵子树包括 tree 的某个节点和这个节点的所有后代节点。tree 也可以看做它自身的一棵子树。

思想:先把根作为一颗树和右边比较看是不是一颗树,因为,相同的树也是子树,不是在和左右子树进行比较 

bool isSameTree(struct TreeNode* p, struct TreeNode* q) {if(p==NULL&&q==NULL){return true;//如果两个都为空,返回真,这是处理到最后节点的时候,也是从根开始的比较,每一次递归的节点都可以看做是这次比较的根}if(p==NULL||q==NULL){return false;//p,q当中至少一个为空的情况,这里就是可以判断一个树有这个节点而另外一棵树没有这个节点的情况,那么这两颗树就是不一样的}//接下来判定值if(p->val!= q->val){return false;//判断值相等作为条件会麻烦一些,判断值不等}//根比较完就开始比较树的左右子树return isSameTree(p->left,q->left)&&isSameTree(p->right,q->right);//左右子树返回一个folse整体就为假
}bool isSubtree(struct TreeNode* root, struct TreeNode* subRoot){
if(root==NULL&&subRoot==NULL)
{return true;
}  
if(root==NULL||subRoot==NULL)
{return false;
}
if(isSameTree(root,subRoot))
{return true;
}// bool ret = isSubtree(root->left,subRoot);
// if(ret)
// {
//     return true;
// }
// ret = isSubtree(root->right,subRoot);
// if(ret)
// {
//     return true;
// }
// return false;
return isSubtree(root->left,subRoot)||isSubtree(root->right,subRoot);}

5.判断一棵树是不是对称二叉树

. - 力扣(LeetCode)

 给你一个二叉树的根节点 root , 检查它是否轴对称。

解题思想:先看一下根不为空,就判断左右有没有,判断左右值相等与否在判断左子树的左边与右子树的右边,判断左子树的右边和右子树的左边

bool isSymmetricTree(struct TreeNode* p,struct TreeNode* q){//先比较根if(p==NULL&&q==NULL)//二者都为空{return true;}if(p==NULL||q==NULL)//二者中右一个为空,一个不为空{return false;}//判断节点的值是否相等if(p->val!= q->val){return false;}//两个都不为空就要判断左右子树return isSymmetricTree(p->left,q->right)&&isSymmetricTree(p->right,q->left);}
bool isSymmetric(struct TreeNode* root) {
//思想:根和根比较,左子树的左边和右子树的右边进行比较,左子树的右边和右子树的左边进行比较2
if(root == NULL)
{return true;
}
//根不等于空就要比较一下左子树和右子树,左子树的左边和右子树的右边是否相等,比较左子树的右边和右子树的左边
//由于后续递归不涉及这棵主树的根,所以单独使用一个递归函数
return isSymmetricTree(root->left,root->right);}

 

6.二叉树遍历

解题:

 

#include <stdio.h>
#include<stdlib.h>
typedef int BTDataType;
typedef struct BinaryTreeNode
{BTDataType val;struct BinaryTreeNode* left;struct BinaryTreeNode* right;
}BTNode;BTNode* CreatTree(char* str ,int*pi)
{if(str[*pi]=='#'){//如果此时字符为#,这个点就是空,不用申请节点(*pi)++;return NULL;}//不为空就申请节点BTNode* root = (BTNode*)malloc(sizeof(BTNode)*1);root->val = str[*pi];(*pi++);//然后递归连接左右子树root->left = CreatTree(str,pi);root->right= CreatTree(str,pi);return root;}
void Inorder(BTNode* root)
{if(root==NULL){return;}Inorder(root->left);printf("%c ",root->val);Inorder(root->right);}int main() {//首先创建一个数组来接收字符串char str[100];scanf("&s",str);int i = 0;//数组大小BTNode* str2 = CreatTree(str,&i);//中序遍历Inorder(str2);return 0;
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/573235.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Docker搭建LNMP环境实战(06):Docker及Docker-compose常用命令

Docker搭建LNMP环境实战&#xff08;06&#xff09;&#xff1a;Docker及Docker-compose常用命令 此处列举了docker及docker-compose的常用命令&#xff0c;一方面可以做个了解&#xff0c;另一方面可以在需要的时候进行查阅。不一定要强行记忆&#xff0c;用多了就熟悉了。 1、…

Fastjson配置消息转换器(时间格式问题)

问题&#xff1a; 我们可以看见&#xff0c;日期的格式有点问题。 由于ArticleListVO类的createTime成员变量是Date类型&#xff0c;默认是由java的Jackson来处理&#xff0c;使用 ISO-8601 规范来处理日期时间格式。ISO-8601 是一种国际标准的日期时间表示法&#xff0c;例如&…

案例分析-IEEE 754浮点标准

案例一&#xff1a; 请分析IEEE 754双精度浮点数规格化数的表示范围。 案例二&#xff1a; 规格化浮点数的Bias为什么采用2k-1-1而不是2k-1​&#xff1f;非规范数的指数E1-Bias而不是0-Bias&#xff1f; &#xff08;1&#xff09; ① bias 127时 E e - 127 &#xff08;00…

7.3*3卷积核生成

1.卷积核 在数字图像处理中的各种边沿检测、滤波、腐蚀膨胀等操作都离不开卷积核的生成。下面介绍如何生成各种3X3的卷积核。为后面的数字图像操作打下基础。   由于图像经过卷积操作后会减少两行两列&#xff0c;因此在生成卷积核的时候一般会对图像进行填充&#xff0c;填充…

Qt中QIcon图标设置(标题、菜单栏、工具栏、状态栏图标)

1 exe程序图标概述 在 Windows 操作系统中&#xff0c;程序图标一般会涉及三个地方&#xff1b; &#xff08;1&#xff09; 可执行程序&#xff08;以及对应的快捷方式&#xff09;的图标 &#xff08;2&#xff09; 程序界面标题栏图标 &#xff08;3&#xff09;程序在任务…

2014年认证杯SPSSPRO杯数学建模C题(第一阶段)土地储备方案的风险评估全过程文档及程序

2014年认证杯SPSSPRO杯数学建模 C题 土地储备方案的风险评估 原题再现&#xff1a; 土地储备&#xff0c;是指市、县人民政府国土资源管理部门为实现调控土地市场、促进土地资源合理利用目标&#xff0c;依法取得土地&#xff0c;进行前期开发、储存以备供应土地的行为。土地…

c++|STL简介+string类的使用(常用接口)

目录 一、STL简介 1.1STL的版本 1.2STL六大组件 1.3STL的重要性及缺陷 二、string类简介 2.1string类了解 2.2为什么学习string类 三、string类使用(常用接口) 3.1string类的成员函数 3.1.1构造函数 3.1.2析构函数 3.1.3“”运算符重载函数 3.2迭代器(iterator)s…

http认证

1.Digest认证 各字段含义&#xff1a; Nonce 服务器直接返回的数据 H1MD5(user”:”realmpassword) H2MD5(method”:”url) method为请求类型、url不包括域名 Nc 指当前的第几次请求&#xff0c;使用8位16进制显示 Cnonce 8位随机字符串 ResponseMD5(H1”:”nonce”:”…

机器学习 | 期望最大化(EM)算法介绍和实现

在现实世界的机器学习应用中&#xff0c;通常有许多相关的特征&#xff0c;但只有其中的一个子集是可观察的。当处理有时可观察而有时不可观察的变量时&#xff0c;确实可以利用该变量可见或可观察的实例&#xff0c;以便学习和预测不可观察的实例。这种方法通常被称为处理缺失…

[串联] MySQL 存储原理 B+树

InnoDB 是一种兼顾高可靠性和高性能的通用存储引擎&#xff0c;在 MySQL 5.5 之后&#xff0c;InnoDB 是默认的 MySQL 存储引擎。 InnoDB 对每张表在磁盘中的存储以 xxx.ibd 后缀结尾&#xff0c;innoDB 引擎的每张表都会对应这样一个表空间文件&#xff0c;用来存储该表的表结…

【Postman如何进行接口测试简单详细操作实例】

1、下载Postman postman下载地址&#xff1a;Download Postman | Get Started for Free 2、安装Postman (1)双击下载好的postman-setup.exe文件&#xff0c;进行安装postman工具 (2)安装完成后&#xff0c;在桌面找到并打开postman软件&#xff0c;输入邮箱和密码进行登录&a…

(七)图像的均值滤波

环境&#xff1a;Windows10专业版 IDEA2021.2.3 jdk11.0.1 OpenCV-460.jar 系列文章&#xff1a; &#xff08;一&#xff09;PythonGDAL实现BSQ&#xff0c;BIP&#xff0c;BIL格式的相互转换 &#xff08;二&#xff09;BSQ,BIL,BIP存储格式的相互转换算法 &#xff08;三…