二叉树刷题总结

题单:

 

 一,相同的树

题目:

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

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

题目接口:

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     struct TreeNode *left;*     struct TreeNode *right;* };*/bool isSameTree(struct TreeNode* p, struct TreeNode* q){}

分析:

要判断两棵树是否相同,首先就要判断根节点是否相同:

1.当两棵树的根节点都为NULL时返回true。

2.当两棵树的根节点一个为NULL一个不为NULL时返回false。

3.当两棵树根节点都不为NULL时并且节点的值不相等时返回false。

当根节点相同时,继续判断左右子树。左右子树都相同时返回true。

 解题代码:

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);}

二,单值二叉树

题目:

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

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

接口:

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     struct TreeNode *left;*     struct TreeNode *right;* };*/bool isUnivalTree(struct TreeNode* root){}

分析:

判断是否是单值二叉树关键就在于一整棵树的每一个节点的值都是一样的。所以我们需要将每一个节点的值与它们的根节点进行比较。当根节点没有左右节点时返回true,当根节点的左右节点与根节点的值不相同时返回false。

代码:

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

三,对称二叉树

题目:

请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。

例如,二叉树 [1,2,2,3,4,4,3] 是对称的。

    1
   / \
  2   2
 / \ / \
3  4 4  3
但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的:

    1
   / \
  2   2
   \   \
   3    3

接口:

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     struct TreeNode *left;*     struct TreeNode *right;* };*/bool isSymmetric(struct TreeNode* root){}

分析:

判断镜像二叉树:

1.当根节点为NULL时直接返回true表示这是一棵镜像二叉树

2.当根节点不为NULL时便对左右节点进行判断。

比如这棵树:

   1
   / \
  2   2
 / \ / \
3  4 4  3

这棵树的根节点不为NULL,所以我们便对左右节点进行判断,左右节点相同便对左的左与右的右,右的左与左的右进行判断。

代码:

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

四,二叉树的前序遍历

 题目:

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

接口:

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     struct TreeNode *left;*     struct TreeNode *right;* };*/
/*** Note: The returned array must be malloced, assume caller calls free().*/
int* preorderTraversal(struct TreeNode* root, int* returnSize){}

分析:

二叉树的前序遍历是一个较为简单的题目,但是要注意的是当你在使用递归来做这道题时传的下标的地址而不能直接传指针的值。

代码:

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     struct TreeNode *left;*     struct TreeNode *right;* };*/
/*** Note: The returned array must be malloced, assume caller calls free().*/int numsSize(struct TreeNode* root)//计算节点数{if(root==NULL)return 0;return numsSize(root->left)+numsSize(root->right)+1;}void preorderTraversal_(int* a,int*numsSize,struct TreeNode* root)//实现前序遍历
{if(root == NULL)return ;a[(*numsSize)++] = root->val;preorderTraversal_(a,numsSize,root->left);preorderTraversal_(a,numsSize,root->right);
}
int* preorderTraversal(struct TreeNode* root, int* returnSize){int n = numsSize(root);//计算个数int* a =(int*) malloc(sizeof(int)*n);//malloc出来一个数组*returnSize = 0;preorderTraversal_(a,returnSize,root);//前序遍历return a;
}

五,二叉树的子树

题目:

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

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

接口:

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     struct TreeNode *left;*     struct TreeNode *right;* };*/bool isSubtree(struct TreeNode* root, struct TreeNode* subRoot){}

 分析:

寻找二叉树的子树。先写一个判断两棵树是否相同的数的函数,然后对判断从根节点处开始的树是否与子树相同。如果不同就比较左子树与右子树。

代码:

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     struct TreeNode *left;*     struct TreeNode *right;* };*/
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&&subRoot==NULL)return true;if(root==NULL||subRoot==NULL)return false;return  isSameTree(root,subRoot)||isSubtree(root->left,subRoot)||isSubtree(root->right,subRoot);}

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

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

相关文章

STM32实战项目—密码锁

该项目的完整工程可以在博主的资源里找到,仅供参考。 文章目录 一、任务要求二、实现方法2.1 输入密码判断2.2 管理员模式2.3 修改密码 三、程序设计3.1 输入密码判断3.2 进入管理员模式3.3 修改密码 四、问题总结4.1 输入内容一直提示Error4.2 密码判断一直错误 五…

ADB原理,常用命令汇总及示例

一. ADB简介 ADB,即 Android Debug Bridge 是一种允许模拟器或已连接的 Android 设备进行通信的命令行工具,它可为各种设备操作提供便利,如安装和调试应用,并提供对 Unix shell(可用来在模拟器或连接的设备上运行各种…

对话小红书剑寒:如何跨方向技术融合,全局优化打造更智能的音视频系统?...

编者按:在 AI 时代,随着 ChatGPT 掀起技术狂潮,构建更智能的音视频系统已经成为音视频领域从业者的共同目标。 然而,音视频系统的智能化,每个从业者对其都有自己独特的视角和理解,正如“一千个人眼中有一千…

基于FreeRTOS的嵌入式设备管理关键技术研究及实现(学习四)

硬件平台 终端设备的硬件选型主要由STM32芯片作为处理器,板载时钟电路和电源电路以及对外通信串口,并挂载AM2302温湿度传感器来实时收集环境相关信息,将收集到的信息通过NB-IoT通信模组上传到云端,从而实现整个环境监测功能。 主…

基于jsp+Servlet+mysql学生信息管理系统V2.0

基于jspServletmysql学生信息管理系统V2.0 一、系统介绍二、功能展示1.项目骨架2.数据库表3.项目内容4.登陆界面5.学生-学生信息6、学生-修改密码7、管理员-学生管理8、管理员-添加学生9.管理员-修改学生信息10.管理员-班级信息11.管理员-教师信息 四、其它1.其他系统实现五.获…

【Linux】LVS负载均衡群集 NAT模式

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 LVS负载均衡群集 NAT模式 一、理解负载均衡群集的原理1.企业群集应用概述2.企业群集分类3.负载均衡群集架构4.负载均衡群集工作模式分析5.NAT模式6.TUN模式7.DR模式 二、LVS虚…

CMU 15-445 -- Tree Indexes - 05

CMU 15-445 -- Tree Indexes - 05 引言Table IndexB TreeB-Tree FamilyB TreeB Tree NodesB Tree OperationsIn Practice Clustered IndexesCompound IndexB Tree Design ChoicesNode SizeMerge ThresholdVariable Length KeysNon-unique IndexesIntra-node Search Optimizatio…

SpringBoot(原理篇)

SpringBoot原理篇 自动配置 bean加载方式 xml方式声明bean 相关类: domain域中的实体类: public class Mouse { }public class Cat { }public class Dog { }测试: public class App1 {public static void main(String[] args) {ClassP…

【hadoop】Linux安装和配置

安装 RedHat Linux 7.4 创建新的虚拟机 选择“自定义(高级)” 选择“下一步” 选择“稍后安装操作系统” 选择操作系统的类型 设置虚拟机名称和保存路径 下一步 下一步 设置网络类型,选择“使用仅主机模式网络” 下一步 下一步 下一步 设置硬…

Web3本地搭建truffle智能合约开发环境

之前的几篇文章 我们是成功的操作了我们本地区块链的 那么 本文 我们就来说说智能合约 啊 不容易啊 扯了这么久 终于到这了 智能合约是部署在区块链上 不可逆的 一种去中心化的程序,他没有任何第三方公司来管理这个程序和数据 然后 还有就是怎么连接到区块链上的智能…

垃圾回收器

CMSParNew配置 -Xms7500m -Xmx7500m 初始堆大小 -Xmn3000m # 新生代大小 -Xss512k # 每个线程的堆栈大小 -XX:MaxMetaspaceSize512m # 设置类元数据区的最大大小(限制Metaspace增长的上限,防止因为某些情况导致Metaspace无限的使用本地内存,影响到其他…

css重点学习

一、选择器 1.标签名选择器 div{border: 5px blue dotted;color: aquamarine;font-size: 20px;} <body><div id"div001">div标签1</div><div id"002">div标签2</div> </body> //只写出了重点部分 2.id选择器 #div0…