二叉树经典题题解

news2024/9/20 10:54:47

目录

🍅1.单值二叉树🍅

🍉 2.相同的树🍉

🍊3.对称二叉树🍊

🍎4.另一颗树的子树🍎

🍏5.翻转二叉树🍏

 🍑6.平衡二叉树🍑


🍅1.单值二叉树🍅

题目OJ链接  力扣

题目描述:

思路:

采用递归的思想,判断当前节点是否与左右孩子相等,不相等则返回false,相等则继续递归左右子树进行判断,并将左右子树判断的结果相&&并返回,递归到空节点说明之前都没有返回false,即前面的子树都返回真,所以递归到空节点则返回真

代码:

bool isUnivalTree(struct TreeNode* root){
    if(root==NULL)//递归到空节点则返回真
        return true;
    if(root->left&&root->val!=root->left->val)//根节点与左孩子比较
    return false;
    if(root->right&&root->val!=root->right->val)//根节点与右孩子比较
    return false;
    //递归左右子树并将两个节点相与返回
    return isUnivalTree(root->left)&&isUnivalTree(root->right);
}

 🍉2.相同的树🍉

题目链接 力扣

题目描述:

 思路:

利用递归的思想,先判断当前两个树根节点是否相同,然后再分别递归两个树当前节点的左孩子和右孩子进行比较,如果过程中有不相等的节点例如则返回false,或者一个树的节点存在而另一个树的节点不存在则返回false,直到递归到两个树的空节点说明之前的节点都相等则返回true

代码:

bool isSameTree(struct TreeNode* p, struct TreeNode* q){
    if(p==NULL&&q==NULL)//递归到两个树的空节点则返回真
    return true;
    if(p==NULL||q==NULL)//一棵树的节点存在而另一颗的节点不存在则返回false
    return false;
    if(p->val!=q->val)//节点的值不相等则返回fasle
    return false;
    //分别递归两个树的左右子树,并将结果相与并返回
    return isSameTree(p->left,q->left)&&isSameTree(p->right,q->right);
}

🍊3.对称二叉树🍊

题目链接 力扣

题目描述:

 思路:

复用第二题相同的树的代码,相同的树题目中是将一颗树的根节点与另一颗的根节点比较,然后再分别比较左孩子和右孩子,这题我们可以将比较反过来,即一个树节点的左孩子和另一个数节点的右孩子进行比较,一个树节点的右孩子和另一个树节点的右孩子进行比较

代码:

 bool _isSymmetric(struct TreeNode* root1,struct TreeNode* root2)
 {
    if(root1==NULL&&root2==NULL)//递归到两个树的空节点则为真
    return true;
    if(root1==NULL||root2==NULL)//有一个树的节点存在而另一个树的节点不存在则返回false
    return false;
    if(root1->val!=root2->val)//节点的值不相等则返回false
    return false;
    //分别递归两个树的左右子树,左孩子节点与右孩子比较,右孩子节点与左孩子比较 
    return _isSymmetric(root1->left,root2->right)&&_isSymmetric(root1->right,root2->left);
 }
bool isSymmetric(struct TreeNode* root){
    return _isSymmetric(root->left,root->right);
}

🍎4.另一颗树的子树🍎

题目链接力扣

题目描述:

 思路:

利用递归的思想,判断两棵树是否都为空树,都为空树则返回真,再判断两颗子树是否有一个为空有一个不为空,如果是说明两个树不同则返回false。先判断整颗树是否与该子树相同,再递归判断左子树是否与该子树相同,最后判断递归右子树是否与该子树相同,如果左右子树都不与该子树,则返回false

代码:

//相同的树代码
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)//两个树有一个为空有一个不为空则返回false
    return false;
    if(isSameTree(root,subRoot))//判断整个树是否与该子树相同
    return true;
    if(isSubtree(root->left,subRoot))//再判断左子树是否与该子树相同
    return true;
    if(isSubtree(root->right,subRoot))//最后判断左子树是否与该子树相同
    return true;
    //左右子树都不和该子树相同则返回false
    return false;
}

🍏5.翻转二叉树🍏

题目链接力扣

题目描述:

 思路:

利用递归的思想,首先判断当前树是否为空树,为空树则返回空,接着进行翻转,首先将当前根节点的左右孩子进行交换,由于节点之间是进行指针链接的,故交换了左右孩子即交换了左右子树,然后递归交换左子树的左右孩子,最后递归交换右子树的左右孩子,直到递归到空节点则结束

代码:

void  _invertTree(struct TreeNode* root)
{
    if(root==NULL)//递归到空节点则结束
    return;
    //左右孩子进行交换
    struct TreeNode* tmp=root->left;
    root->left=root->right;
    root->right=tmp;
    递归左右子树
    _invertTree(root->left);
    _invertTree(root->right);
}
struct TreeNode* invertTree(struct TreeNode* root){
   if(root==NULL)
   return NULL;
    _invertTree(root);
    return root;
}

🍑 6.平衡二叉树🍑

题目链接力扣

题目描述:

思路:

先写出求一棵树的高度的函数(见上一篇文章),再判断整棵树的左右子树高度差的绝对值是否小于1,如果左子树存在则递归左子树,判断左子树的左右子树高度差的绝对值是否小于1,然后如果右子树存在则递归左子树,判断右子树的左右子树高度差的绝对值是否小于1,如果左子树的左右子树高度差和右子树的左右子树高度差绝对值都小于1则返回真,或者直到递归到空节点或者叶子结点则说明之前的递归过程没有返回false即平衡二叉树的条件,此时返回true

代码: 

//求树的高度的函数
 int HeightTree(struct TreeNode* root)
 {
     if(root==NULL)
     return 0;
     if(root->left==NULL&&root->right==NULL)
     return 1;
     int left=HeightTree(root->left);
     int right=HeightTree(root->right);
     return left>right? left+1:right+1;
 }
bool isBalanced(struct TreeNode* root){
    if(root==NULL)//递归到空节点则返回真
    return true;
    if(root->left==NULL&&root->right==NULL)//递归到叶子节点则函数真
    return true;
    if(abs(HeightTree(root->left)-HeightTree(root->right))>1)//判断当前左右子树高度差绝对值
     return false;
    if(root->left)//左子树存在则递归左子树
    {
        if(isBalanced(root->left)==false)
        return false;
    }
    if(root->right)//右子树存在则递归右子树
    {
        if(isBalanced(root->right)==false)
        return false;
    }
    //左右子树的左右子树高度差绝对值都小于1则返回真
    return true;
}

好啦,关于二叉树经典题解我们就先学到这里,如果对您有所帮助,欢迎一键三连~

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

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

相关文章

【LeetCode: 1027. 最长等差数列 | 暴力递归=>记忆化搜索=>动态规划】

🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,…

SHELL的脚本编辑与运行

目录 1.编写脚本for1.sh,使用for循环创建20账户,账户名前缀由用户从键盘输入,账户初始密码由用户输入,例如:test1、test2、test3、、test10 a.编辑脚本 b.运行脚本 c.进行检验 2.编写脚本for2.sh,使用for循环,通过…

如何把aac转化为mp3,4个处理方法教给你

一般情况下,将 AAC 文件转换为 MP3 文件有以下几种情况:设备不兼容:AAC 格式通常用于苹果设备上。如果您想在其他设备上播放音频文件,如 Android 手机、MP3 播放器等,就需要将其转换为 MP3 格式。需要更好的兼容性&…

机器学习(七):基于多项式贝叶斯对蘑菇毒性分类预测分析

系列文章目录 作者:i阿极 作者简介:Python领域新星作者、多项比赛获奖者:博主个人首页 😊😊😊如果觉得文章不错或能帮助到你学习,可以点赞👍收藏📁评论📒关注…

第六章 原型模式

文章目录 前言一、克隆羊问题sheep类clint 调用方 二、引入原型模式动态克隆对象sheep类clint 类 三、原型模式在Spring框架中源码分析四、深拷贝与浅拷贝完整代码DeepCloneableTargetDeepProtoTypeClient2 五、原型模式的注意事项和细节 前言 一、克隆羊问题 sheep类 package…

mysql查询字段未加引号问题及隐式转换

1. 问题重现 最近线上出了个问题,用户明明没有投票,却提示已投票,我查询数据,刚开始没有查出数据,后来却查出数据了,以为没有问题,后来以为是插入的时候通过int类型插入,导致varcha…

美国最大公共养老基金之一Strs Ohio不断增持IonQ股票

​ (图片来源:网络) 截至2022年12月31日第四季度末,美国最大的公共养老基金之一Strs Ohio发布报告称,其一直在增持IonQ,Inc.(纽约证券交易所代码:IONQ)的股份。资产管理公…

如何在云服务器/云主机上部署最新版本的Hadoop3.3.5(Ubuntu20.0.4)

在云服务器上部署Hadoop 步骤1:更新系统 sudo apt-get update sudo apt-get upgrade步骤2:安装Java Hadoop需要Java运行环境。首先,安装OpenJDK 8: sudo apt-get install openjdk-8-jdk检查Java版本: java -versi…

上海车展:比亚迪宋L概念车全球首发,这是要硬扛特斯拉?

纵观2023年的新能源汽车市场,特斯拉可以说当仁不让地成为了全球最为“吸睛”的车企之一。凭借一系列令无数人瞠目结舌的降价举措,特斯拉给全球汽车市场带来了强烈冲击。虽然特斯拉上海工厂已经接近满负荷运转,但是面对雪片般飞来的订单依然供…

SpringBoot设置动态定时任务

SpringBoot设置动态定时任务 1.准备工作 搭建SpringBoot工程 引入相关依赖 <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><depende…

ROS学习第八节——话题通信自定义msg

1.介绍 在 ROS 通信协议中&#xff0c;数据载体是一个较为重要组成部分&#xff0c;ROS 中通过 std_msgs 封装了一些原生的数据类型,比如:String、Int32、Int64、Char、Bool、Empty.... 但是&#xff0c;这些数据一般只包含一个 data 字段&#xff0c;结构的单一意味着功能上的…

Java基础(九)多线程

我们之前学习的程序在没有跳转语句的情况下&#xff0c;都是由上至下沿着一条路径依次执行。现在想要设计一个程序&#xff0c;可以同时有多条执行路径同时执行。比如&#xff0c;一边游戏&#xff0c;一边qq聊天&#xff0c;一边听歌&#xff0c;怎么设计&#xff1f; 要解决…

每日一个小技巧:今天告诉你拍照识别文字的软件有哪些

在现代社会里&#xff0c;手机已经成为了人们生活中必不可少的工具。它的功能众多&#xff0c;比如通讯、上网、拍照以及导航等&#xff0c;为我们的生活带来了许多便利。除此之外&#xff0c;手机还能帮助我们解决一些实际的问题&#xff0c;例如&#xff0c;当你需要识别图片…

Spring Aop详解汇总

文章目录 近期想法什么是AOPSpringAOP与AspectjSpringAOP体系概述概念详解连接点- Jointpoint切入点- Pointcut通知- Advice切面- Aspect织入- Weaving 实现原理—动态代理JDK动态代理描述原理代码示例注意执行结果 优点缺点 CGLib动态代理描述原理代码示例注意执行结果 优点缺…

ChatGPT会凉吗?巴菲特、马斯克呼吁暂停

ChatGPT 迅速“风靡”全球&#xff0c;无疑成为了人工智能领域备受瞩目的“明星产品”&#xff0c;然而随着 ChatGPT 应用越来越广泛&#xff0c;陆续爆出被用于学术造假、制作黑客武器以及泄露用户敏感聊天信息等一系列负面新闻。至此&#xff0c;社会开始重新审视类似 ChatGP…

图像傅里叶变换以及频谱中心化

图像的空域滤波&#xff1a; I ∗ G I*G I∗G 矩阵 I I I与一个小矩阵 G G G进行卷积 图像的频域滤波&#xff1a; F − 1 [ F [ I ] H ] F^{-1}[F[I]\times H] F−1[F[I]H] 矩阵 I I I的傅里叶变换与同样大小的矩阵 H H H进行对应元素相乘&#xff0c;然后将结果通过逆傅里…

并查集解决图的连通性问题

并查集 1. 定义2.并查集3.模板代码4. 力扣例题4.1 剑指 Offer II 118. 多余的边4.2 力扣695. 岛屿的最大面积 1. 定义 在计算机科学中&#xff0c;并查集&#xff08;英文&#xff1a;Disjoint-set data structure&#xff0c;直译为不交集数据结构&#xff09;是一种数据结构&…

卷积神经网络轻量化教程之通道剪枝【附代码】

这两天自己手写了一个可以简单实现通道剪枝的代码&#xff0c;在这篇文章中也会对代码进行讲解&#xff0c;方便大家在自己代码中的使用。 如果还想学习YOLO系列的剪枝代码&#xff0c;可以参考我其他文章&#xff0c;下面的这些文章都是我根据通道剪枝的论文在YOLO上进行的实…

React框架----路由管理

文章目录 SPA路由路由基本使用路由组件与一般组件NavLink SPA single page application只有一个页面异步请求数据&#xff0c;局部更新页面本地局部切换页面&#xff08;不会向服务端加载整个页面&#xff09; 路由 地址栏路径与组件的对应关系切换路径&#xff0c;则切换组…

YOLOv5+单目跟踪(python)

YOLOv5单目跟踪&#xff08;python&#xff09; 1. 目标跟踪2. 测距模块2.1 设置测距模块2.2 添加测距 3. 主代码4. 实验效果 相关链接 1. YOLOv5单目测距&#xff08;python&#xff09; 2. YOLOv7单目测距&#xff08;python&#xff09; 3. YOLOv7单目跟踪&#xff08;pytho…