【二叉树】—— 算法题

一、单值二叉树

        题目要求:判断二叉树是不是单值二叉树(就是所以节点的值都相等)。

思路:

        利用二叉树的递归思想,判断每一个节点值与其左右子节点的值是否相等,如果遇到空节点,就返回true(说明每一个节点值都相等);如果遇到节点的值与其左右节点值不相等就返回false;如果该节点的值与其左右子节点的值都相等,就接着递归该节点的左右子树。

代码如下:

bool isUnivalTree(struct TreeNode* root) {if (root == NULL) {return true;}if (root->left && root->left->val != root->val) {return false;}if (root->right && root->right->val != root->val) {return false;}return isUnivalTree(root->left) && isUnivalTree(root->right);
}

二、相同的树 — 对称二叉树 — 另一颗树的子树

        2.1、相同的树

        判断两个二叉树是否相等

思路:

        同时遍历两个二叉树,如果遍历到两个二叉树节点同时为空,就说明这两个二叉树相同;如果其中一个为空而另一个不为空,就说明两个二叉树不相同;如果遍历过程中,遇到两个二叉树节点的值不相等,则两个二叉树不相同。

简单分析一下:

        同时遍历这两个二叉树

        两个二叉树节点都不为空且值相等,继续遍历其左子树

        两个二叉树节点都不为空且值相等,继续遍历其左子树

        两个二叉树节点都为空,返回true

        先遍历二叉树是2节点的右节点,也为空,这里直接跳过了。

        这里回退到1这个节点,接下来遍历1的右子树

        遍历到节点都不为空,且值相等,继续遍历 (这因为3的左右节点都为空,就一步带过)

        遍历结束,没有遇到一个节点为空一个节点不为空或者值不相等的情况,就返回true。

代码如下:

typedef struct TreeNode TreeNode;
bool isSameTree(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 isSameTree(p->left, q->left) && isSameTree(p->right, q->right);
}

        2.2、对称二叉树

        

        判断二叉树是否是对称二叉树,这里还是实现与上题相同的树类似的思路。

思路:

        利用相同的树的方法,判断二叉树根节点的左右子树是否对称(判断对称直接判断一个节点的左子树和另一个节点的右子树是否相等即可)。

代码如下:

typedef struct TreeNode TreeNode;
bool isSameTree(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 isSameTree(p->left, q->right) && isSameTree(p->right, q->left);
}
bool isSymmetric(struct TreeNode* root) {return isSameTree(root->left,root->right);
}

        2.3、另一颗树的子树

        判断一个树是否是另一个树的子树

思路:

        还是利用相同二叉树的方法,判断二叉树及其左右子树中是否存在与另一棵树相同的树。

代码如下:

typedef struct TreeNode TreeNode;
bool isSameTree(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 isSameTree(p->left, q->left) && isSameTree(p->right, q->right);
}bool isSubtree(struct TreeNode* root, struct TreeNode* subRoot){if(root==NULL){return false;}if(isSameTree(root,subRoot)){return true;}return isSubtree(root->left,subRoot)||isSubtree(root->right,subRoot);
}

三、二叉树的遍历(前序、中序、后序)

        本题要求,前序遍历二叉树,并且返回前序遍历的结果(以数组方式返回),并且还用通过指向修改数据个数。

思路:

        这里首先求二叉树的节点个数;然后动态申请内存来存储数据并且用来最后返回数组首元素地址;最后就是将数据存储到数组当中了,使用前序遍历。

代码如下:

typedef struct TreeNode TreeNode;
int TreeSize(TreeNode* root) {if (root == NULL) {return 0;}return TreeSize(root->left) + TreeSize(root->right) + 1;
}
void _preorderTraversal(TreeNode* root,int* arr,int* pi)
{if(root==NULL){return ;}arr[(*pi)++]=root->val;_preorderTraversal(root->left,arr,pi);_preorderTraversal(root->right,arr,pi);
}
int* preorderTraversal(struct TreeNode* root, int* returnSize) {// 求出二叉树的节点个数*returnSize =TreeSize(root);// 动态申请空间大小int* returnArr=(int*)malloc(sizeof(int)*(*returnSize));// 前序遍历int i=0;_preorderTraversal(root,returnArr,&i);return returnArr;
}

中序和后序遍历与其思路一样这里直接看代码。

中序遍历

 typedef struct TreeNode TreeNode;
int TreeSize(TreeNode* root) {if (root == NULL) {return 0;}return TreeSize(root->left) + TreeSize(root->right) + 1;
}
void _inorderTraversal(TreeNode* root,int* arr,int* pi)
{if(root==NULL){return ;}_inorderTraversal(root->left,arr,pi);arr[(*pi)++]=root->val;_inorderTraversal(root->right,arr,pi);
}
int* inorderTraversal(struct TreeNode* root, int* returnSize) {// 求出二叉树的节点个数*returnSize =TreeSize(root);// 动态申请空间大小int* returnArr=(int*)malloc(sizeof(int)*(*returnSize));// 中序遍历int i=0;_inorderTraversal(root,returnArr,&i);return returnArr;
}

后序遍历

  typedef struct TreeNode TreeNode;
int TreeSize(TreeNode* root) {if (root == NULL) {return 0;}return TreeSize(root->left) + TreeSize(root->right) + 1;
}
void _postorderTraversal(TreeNode* root,int* arr,int* pi)
{if(root==NULL){return ;}_postorderTraversal(root->left,arr,pi);_postorderTraversal(root->right,arr,pi);arr[(*pi)++]=root->val;
}
int* postorderTraversal(struct TreeNode* root, int* returnSize) {// 求出二叉树的节点个数*returnSize =TreeSize(root);// 动态申请空间大小int* returnArr=(int*)malloc(sizeof(int)*(*returnSize));// 中序遍历int i=0;_postorderTraversal(root,returnArr,&i);return returnArr;
}

四、二叉树的构建和遍历

        创建二叉树,并且中序遍历。

因为这里题目说先序遍历字符串(我们根据这个来构建二叉树),本题要求写全部代码。

思路:

        先创建字符数组,根据输入的字符串进行创建二叉树,创建完成以后再进行中序遍历输出即可。

代码如下:

#include <stdio.h>
#include<stdlib.h>
typedef struct BinaryTreeNode
{char str;struct BinaryTreeNode* left;struct BinaryTreeNode* right;
}BTNode;BTNode* BuyNode(char x)
{BTNode* newnode=(BTNode* )malloc(sizeof(BTNode));newnode->str=x;newnode->left=newnode->right=NULL;return newnode;
}
BTNode* CreatTree(char* str,int* pi)
{if(str[*pi]=='#'){(*pi)++;return NULL;}BTNode* root=BuyNode(str[(*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->str);InOrder(root->right);
}
int main() {char str[100];scanf("%s",str);//根据字符创建二叉树int i=0;BTNode* root=CreatTree(str, &i);InOrder(root);return 0;
}

感谢各位大佬支持并指出问题,

                        如果本篇内容对你有帮助,可以一键三连支持以下,感谢支持!!!

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

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

相关文章

醒醒,别睡了...讲《数据分析pandas库》了—/—<7>

一、 1、处理缺失值 1.1 认识缺失值 系统默认的缺失值 None 和 np. nan datapd.Series([3,4,np.nan,1,5,None]) dfpd.DataFrame([[1,2,None],[4,np.nan,6],[5,6,7]]) 1.2 缺失值查看 直接调用info() 方法就会返回每一列的缺失情况。 dfpd.DataFrame([[1,2,np.nan],[4,np.n…

在Linux中,MySQL备份与恢复

随着自动化办公与电子商务的不断发展&#xff0c;企业对于信息系统的依赖性越来越高&#xff0c;而数据库在信息系统中担任着非常重要的角色。尤其一些对数据可靠性要求非常高的行业,如银行、证券、电信等&#xff0c;如果发生意外宕机或数据丢失&#xff0c;其损失是非常严重的…

[ACTF2020 新生赛]Upload1

打开靶机&#xff0c;发现什么都没有 查看源码发现有个表单&#xff0c;不过高度为0&#xff0c;所以被隐藏了&#xff0c;我们直接找打css文件&#xff0c;清空&#xff08;也可以设置原始高度&#xff09; 然后提交木马脚本&#xff0c;直接提交PHP不通过 修改为phtml&#x…

Java | Leetcode Java题解之第299题猜数字游戏

题目&#xff1a; 题解&#xff1a; class Solution {public String getHint(String secret, String guess) {int bulls 0;int[] cntS new int[10];int[] cntG new int[10];for (int i 0; i < secret.length(); i) {if (secret.charAt(i) guess.charAt(i)) {bulls;} e…

初学Mybatis之多对一查询 association 和一对多查询 collection

XML 映射器 多对一&#xff1a;关联&#xff08;association&#xff09; 一对多&#xff1a;集合&#xff08;collection&#xff09; mysql 创建教师、学生表&#xff0c;插入数据 create table teacher(id int(10) primary key,name varchar(30) default null ) engineI…

OpenSource - Ip2region 离线IP地址定位库和IP定位数据管理框架

文章目录 Ip2region 是什么Ip2region 特性1、IP 数据管理框架2、数据去重和压缩3、极速查询响应 xdb 数据查询xdb 数据生成xdb 数据更新手动编辑更新检测自动更新 相关备注1、并发查询必读2、技术资源分享 Release Ip2region 是什么 https://github.com/lionsoul2014/ip2regio…

【C++】使用哈希表封装unordered_map与unordered_set

文章目录 1. unordered系列关联式容器1.1 unordered_set1.2 unordered_map 2. unordered_set/map的封装2.1 基本接口2.2 迭代器2.2.1 迭代器的结构2.2.2 set迭代器的封装2.2.3 map迭代器的封装 3.完整代码3.1HashTable3.2unordered_set3.3unordered_map 1. unordered系列关联式…

Windows Redis启动方式及保持服务运行方法

1. Redis启动方法 1. cmd进入redis文件夹下&#xff0c;输入&#xff1a;redis-server.exe redis.windows.conf&#xff0c;出现如下界面启动成功。但此cmd窗口要一直保持打开状态&#xff0c;一旦关闭redis也就关闭了。要想cmd关闭&#xff0c;但redis处于打开状态&#xff…

医疗器械上市欧美,需要什么样的网络安全相关申报文件?

医疗器械在欧美上市时&#xff0c;需要提交的网络安全相关申报文件主要包括以下几个方面&#xff0c;这些要求基于欧美地区的法律法规和监管机构的指导文件。 一、美国FDA要求 1. 网络安全管理计划 内容&#xff1a;制造商需要提交一份网络安全管理计划&#xff0c;该计划应包含…

【人工智能】人工智能概论(一):人工智能基本概概念、学派、发展历程与新一代人工智能

文章目录 1. 人工智能的基本概念与定义2. 人工智能的主要学派及主旨思想2.1. 符号主义学派&#xff1a;AI源自数学逻辑2.2. 连接主义学派&#xff1a;AI源自仿生学2.3. 行为主义学派&#xff1a;AI源自控制论 3. 人工智能的起源及发展历程4. 驱动新一代人工智能快速发展的因素 …

【C语言】C语言期末突击/考研--导学篇

前言 我将把C语言的知识要点&#xff0c;学习收获以文章形式发表&#xff0c;由于我目前也还是一个菜鸟&#xff0c;难以避免错误和存在观点片面的部分&#xff0c;非常感谢读者指正&#xff01;希望能在这里与大家共同进步&#xff0c;早日成为大牛&#xff01;进入大厂&…

本地使用Git同步、配合Gitee同步至仓库并下拉到本地(亲手调试,全能跑通)

这几天在公司&#xff0c;同事都在使用Gitee上传项目&#xff0c;进行同步&#xff0c;我也进行了简单学习了解了一下版本控制软件Git&#xff0c;挺不错的&#xff0c;故写个笔记记录一下。 本篇博文主要涉及的内容&#xff1a; 1&#xff0c;本地写代码&#xff0c;通过Git同…

初阶数据结构1 算法复杂度

1.数据结构概念 数据结构(Data Structure)是计算机存储、组织数据的⽅式&#xff0c;指相互之间存在⼀种或多种特定关系的数 据元素的集合。没有⼀种单⼀的数据结构对所有⽤途都有⽤&#xff0c;所以我们要学各式各样的数据结构&#xff0c; 如&#xff1a;线性表、树、图、哈…

【C++】—— 类和对象(一)

【C】—— 类和对象&#xff08;一&#xff09; 1、类的定义1.1、类定义1.1.1、类定义格式1.1.2、成员变量的标识1.1.3、C 中的 s t r u c t struct struct1.1.4、C 中的内联函数1.1.5、总结 1.2、访问限定符1.3、类域 2、实例化2.1、实例化的概念2.2、对象大小2.2.1、对象的大…

lenovo联想ThinkBook 14 G4+ IAP/ARA(21CX,21D0)笔记本原装出厂Windows11系统预装OEM镜像下载

ThinkBook 14 G4 IAP【21CX】原厂系统Win11恢复安装包&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1iY9BxidIbv4RnXKaqbydTA?pwd9wc6 提取码&#xff1a;9wc6 ThinkBook 14 G4 ARA【21D0】原厂系统Win11恢复安装包&#xff1a; 链接&#xff1a;https://pan.ba…

nest学习笔记(一)

介绍 nest是一个用于构建高效&#xff0c;可拓展的nodejs服务端应用程序的框架&#xff0c;它使用渐进式javascript&#xff0c;使用Typescript构建并且完全支持Typescript&#xff0c;而且运行开发者使用javascript编写代码&#xff0c;提供了OOP、FP、FRP nest的底层是基于…

Linux编程:使用python或者shell获取系统信息

0. 概要 在日常的系统管理和性能监控中&#xff0c;获取系统信息是一个非常常见的需求。 本文将介绍如何使用Python和Shell脚本来获取这些系统信息。 1. 使用Python获取系统信息 使用psutil库来获取系统的CPU、内存、磁盘和网络信息。 1.1 安装psutil库 首先&#xff0c;我…

盗梦空间续集(InceptionNeXt):使用Inception优化加速ConvNeXt实现ImageNet-1K的最佳精度

Abstract 灵感来自ViT的长距离建模能力&#xff0c;大核卷积最近被广泛研究和采用&#xff0c;以扩大感受野并提高模型性能&#xff0c;例如显著的工作ConvNeXt采用77深度卷积。虽然这种深度算子只消耗少量的FLOPs&#xff0c;但由于高内存访问成本&#xff0c;它在强大计算设…

java实战项目--拼图小游戏(附带全套源代码)

个人主页VON 所属专栏java实战项目游戏参考黑马程序员 一、效果展示 二、功能介绍 游戏中所有的图片以及代码均已打包&#xff0c;玩家直接安装游戏即可&#xff0c;不用idea也可以畅玩。 游戏功能比较单一&#xff0c;只有简单的拼图功能。 a&#xff1a;展示原图重新游戏&a…

《汇编语言 基于x86处理器》- 读书笔记 - 第3章-汇编语言基础

《汇编语言 基于x86处理器》- 读书笔记 - 第3章-汇编语言基础 3.1 基本语言元素3.1.1 第一个汇编语言程序常见汇编语言调用规范 3.1.2 整数常量&#xff08;基数、字面量&#xff09;3.1.3 整型常量表达式3.1.4 实数常量十进制实数十六进制实数&#xff08;编码实数&#xff09…