【二叉树】力扣OJ题

文章目录

  • 前言
  • 1. 翻转二叉树
    • 1.1 题目
    • 1.2 解题思路
    • 1.3 代码实现
    • 1.4 时空复杂度
  • 2. 对称二叉树
    • 2.1 题目
    • 2.2 解题思路
    • 2.3 代码实现
    • 2.4 时空复杂度
  • 3. 平衡二叉树
    • 3.1 题目
    • 3.2 解题思路
    • 3.3 代码实现
    • 3.4 时空复杂度
  • 结语


前言

本篇博客主要介绍二叉树的经典 OJ 题,题目主要来源于力扣和牛客网,熟练掌握这些题型将会使你对二叉树的理解更上一层楼


1. 翻转二叉树

原题地址:力扣 226.翻转二叉树

1.1 题目

给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点

在这里插入图片描述

1.2 解题思路

看到是二叉树,我们就要考虑能不能使用递归法(大部分情况下是可以的)。在本题中,题目要求我们翻转二叉树,意思也就是以根节点为基准,交换左右子树(示例2),而且子树也同理(示例1),我们需要递归的交换左右子树,达到翻转二叉树的效果,最后返回根节点

根据思路我们可以总结出递归的两个条件:

  1. 终止条件

    当前节点为 null 就返回

  2. 单层递归的逻辑

    交换当前节点的左右节点,再递归的交换当前节点的左节点,递归的交换当前节点的右节点

1.3 代码实现

class Solution {public TreeNode invertTree(TreeNode root) {//终止条件if(root == null) {return null;}//暂时存储左节点,让左右节点交换TreeNode tmp = root.left;root.left = root.right;root.right = tmp;//交换结束,递归左节点invertTree(root.left);//递归右节点invertTree(root.right);//最后返回根节点return root;}
}

1.4 时空复杂度

时间复杂度为 O(N),每个节点都会遍历到

空间复杂度为 O(N),最坏情况下树形成链状


2. 对称二叉树

原题链接:力扣 101.对称二叉树

2.1 题目

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

在这里插入图片描述

2.2 解题思路

题目要求我们判断一棵二叉树是否轴对称,通过示例我们可以看出,轴对称是以根节点为基准的,也就是说,子树我们就不要求轴对称(要跟前一道题做区分)。就像示例 1,我们需要比较的是左子树的右子树右子树的左子树是否相等

在这里我们还是使用递归法

  1. 终止条件

    首先要判断两个节点是否为空:

    • 左节点为空,右节点也为空,返回 true
    • 左节点为空,右节点不为空,返回 false
    • 左节点不为空,右节点为空,返回 false

    此时排除了节点为空的情况,可以来判断节点里的值是否相等了:

    • 相等返回 true,不相等返回 false
  2. 单层递归的逻辑

    此时就要来往下递归,传入左节点的右孩子跟右节点的左孩子,再 与(&&) 上传入左节点的左孩子和右节点的右孩子,如果左右堆成就返回 true,有一侧不对称就返回 false

2.3 代码实现

class Solution {public boolean isSymmetric(TreeNode root) {//先把根节点为null的情况排除掉if(root == null) {return true;}//传入根节点的左右子树return isSymmetricChild(root.left, root.right);}public boolean isSymmetricChild(TreeNode leftTree, TreeNode rightTree) {//都为null,则返回trueif(leftTree == null && rightTree == null) {return true;}//因为上面排除了都为null的情况,所以这里只要有一个是null,就返回falseif(leftTree == null || rightTree == null) {return false;}//都不为null,开始判断里面的值if(leftTree.val != rightTree.val) {return false;}//开始递归传入左子树的右节点和右子树的左节点//以及左子树的左节点和右子树的右节点,同为true就返回true,否则就只能返回falsereturn isSymmetricChild(leftTree.left,rightTree.right) && isSymmetricChild(leftTree.right,rightTree.left);}
}

2.4 时空复杂度

时间复杂度为 O(N),每次递归都可以判断一对节点是否堆成,因此最多调用 N / 2 次

空间复杂度最差情况下也是 O(N)


3. 平衡二叉树

原题链接:力扣 110.平衡二叉树

3.1 题目

给定一个二叉树,判断它是否是平衡二叉树

平衡二叉树 是指该树所有节点的左右子树的深度相差不超过 1

在这里插入图片描述

3.2 解题思路

在力扣的题目中,默认根节点的深度是 1。要求该树所有节点的左右子树深度相差不超过 1,也就是小于等于 1,那我们就得去遍历,至于是哪种遍历,我们要根据题目需求,它让我们求高度还是求深度

求高度使用后序遍历:因为后序遍历是左右根(LRN),因此父节点可以根据左右节点返回上来的高度数再加一,层层向上,得到树的高度

求深度使用前序遍历:因为前序遍历是根左右(NLR),它能一直向下遍历,而不是向上去返回结果,求得深度

在本题中,我们要求的是深度,做后序遍历可以从底至顶返回子树深度,当前树的深度等于左子树的深度右子树的深度中的最大值 +1。还是经典的递归:

  1. 终止条件

    遇到空节点就终止,返回 0,表示此时以该节点为根节点的树的高度为 0

  2. 单层递归的逻辑

    我们要比较左子树高度和其右子树高度的差值。分别求出其左右子树的高度,然后如果差值小于等于1,则返回 true,否则返回 false,表示已经不是二叉平衡树

3.3 代码实现

class Solution {public boolean isBalanced(TreeNode root) {//先判断根节点是否为null的情况if (root == null) {//是就返回truereturn true;}//求左子树的深度int leftH = getHeight(root.left);//求右子树的深度int rightH = getHeight(root.right);//相减的绝对值小于1,则表示以该节点为根节点的树平衡,返回true,再与上该节点的左子树和右子树return Math.abs(leftH - rightH) <= 1&& isBalanced(root.left)&& isBalanced(root.right);}//求树的深度public int getHeight(TreeNode root) {if (root == null) {return 0;}//往下一直递归int leftHeight = getHeight(root.left);int rightHeight = getHeight(root.right);//返回左右子树的深度的最大值,还要加一return leftHeight > rightHeight ?leftHeight+1 : rightHeight+1;}
}

3.4 时空复杂度

时间复杂度为 O(N),最差情况下要遍历所有节点

空间复杂度为 O(N),最差情况下,树退化成链表,递归需要使用 O(N) 的栈空间


结语

这几道题我在一两个月前就已经做过的题,现在回来重新写一遍还是有点吃力。想写成博客,把做题思路顺畅地写出来还是很难。而且二叉树的很多题用递归写很方便,就是不好讲,讲了也不一定能看懂😣请见谅

主要还是因为博主太菜了,力扣的题也刷的很少。大家在刷题的时候没思路可以看看评论区大佬的讲解,懂了后再去自己敲一遍。博主这种菜鸟就是这样做的,虽然提升有点慢,但也多多少少吸收点做题经验

新手刷题常常会出现明明之前看题解后做过,过段时间再回来还是一点做不出来,正常(我的现状😭),只能多刷几遍,共勉吧家人们

希望大家能喜欢这篇文章,有总结不到位的地方还请多多谅解,若有出现纰漏,希望大佬们看到错误之后能够在私信或评论区指正,博主会及时改正,共同进步!

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

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

相关文章

MyBatis详细教程!!(入门版)

目录 什么是MyBatis&#xff1f; MyBatis入门 1&#xff09;创建工程 2&#xff09;数据准备 3&#xff09;配置数据库连接字符串 4&#xff09;写持久层代码 5&#xff09;生成测试类 MyBatis打印日志 传递参数 MyBatis的增、删、改 增&#xff08;Insert&#xff0…

有什么普通人可以做的赚钱软件?盘点9个适合普通人长期做的软件

在这个互联网高速发展的时代&#xff0c;智能手机已经成为我们生活中不可分割的一部分。众多APP的涌现&#xff0c;使得许多朋友都在寻求通过手机赚钱的方法。 然而&#xff0c;面对市面上琳琅满目的网上赚钱APP&#xff0c;我们该如何挑选呢&#xff1f;别担心&#xff0c;今…

功率电感设计方法2:实例

文章目录 1&#xff1a;美磁的选项手册截图2&#xff1a;设计步骤2.1&#xff1a;设计需求2.2:选择磁芯材料2.3&#xff1a;选择磁芯2.4 查询 A L A_{L} AL​自感系数2.5 初算匝数2.6重新校准验算感量 3&#xff1a;后续 绕线因子4&#xff1a;日常壁纸分享 参考手册链接 1&…

普通人转行程序员,最大的困难是找不到就业方向

来百度APP畅享高清图片 大家好&#xff0c;这里是程序员晚枫&#xff0c;小破站也叫这个名。 我自己是法学院毕业后&#xff0c;通过2年的努力才转行程序员成功的。[吃瓜R] 我发现对于一个外行来说&#xff0c;找不到一个适合自己的方向&#xff0c;光靠努力在一个新的行业里…

使用Java 将字节数组转成16进制的形式

概述 在很多场景下&#xff0c;需要进行分析字节数据&#xff0c;但是我们存起来的字节数据一般都是二进制的&#xff0c;这时候就需要我们将其转成16进制的方式方便分析。比如在做音视频的时候&#xff0c;需要看下我们传输的视频h264数据中是否有对应的I帧或者B帧等数据&…

07、SpringBoot 源码分析 - SpringApplication启动流程七

SpringBoot 源码分析 - SpringApplication启动流程七 初始化基本流程SpringApplication的prepareContext准备上下文postProcessApplicationContext处理applyInitializers初始化器初始化load SpringApplication的refreshContext刷新上下文refreshServletWebServerApplicationCon…

8.什么是HOOK

程序编译的本质是&#xff0c;首先计算机它只能看得懂机器码也就是只能看得懂数字&#xff0c;机器码学起来很费劲然后就创造了编译器这个东西&#xff0c;编译器它懂机器语言所以它可以跟机器沟通&#xff0c;而我们人可以跟编译器沟通&#xff0c;人跟编译器的语言就是各种各…

[Vulnhub]Vulnix 通过NFS挂载+SSH公钥免密登录权限提升

端口扫描 Server IP AddressPorts Open192.168.8.103TCP:22/tcp, 25/tcp, 79/tcp, 110/tcp, 111/tcp, 143/tcp, 512/tcp, 513/tcp, 514/tcp, 993/tcp, 995/tcp, 2049/tcp, 37522/tcp, 42172/tcp, 43219/tcp, 47279/tcp, 54227/tcp $ nmap -p- 192.168.8.103 -sV -sC --min-ra…

MyBatis系统学习 - 使用Mybatis完成查询单条,多条数据,模糊查询,动态设置表名,获取自增主键

上篇博客我们围绕Mybatis链接数据库进行了相关概述&#xff0c;并对Mybatis的配置文件进行详细的描述&#xff0c;本篇博客也是建立在上篇博客之上进行的&#xff0c;在上面博客搭建的框架基础上&#xff0c;我们对MyBatis实现简单的增删改查操作进行重点概述&#xff0c;在MyB…

P459 包装类Wrapper

包装类的分类 1&#xff09;针对八种基本数据类型相应的引用类型——包装类。 2&#xff09;有了类的特点&#xff0c;就可以调用类中的方法。 Boolean包装类 Character包装类 其余六种Number类型的包装类 包装类和基本数据类型的相互转换 public class Integer01 {publi…

解决文件夹打开出错问题:原因、数据恢复与预防措施

在我们日常使用电脑或移动设备时&#xff0c;有时会遇到一个非常棘手的问题——文件夹打开出错。这种错误可能会让您无法访问重要的文件和数据&#xff0c;给工作和生活带来极大的不便。本文将带您深入了解文件夹打开出错的原因&#xff0c;并提供有效的数据恢复方案&#xff0…

【网络协议】应用层协议--HTTP

文章目录 一、HTTP是什么&#xff1f;二、HTTP协议工作过程三、HTTP协议1. fiddler2. Fiddler抓包的原理3. 代理服务器是什么?4. HTTP协议格式1.1 请求1.2 响应 四、认识HTTP的请求1.认识HTTP请求的方法2.认识请求头&#xff08;header&#xff09;3.认识URL3.1 URL是什么&…

SparkSQL入门

1、SparkSQL是什么&#xff1f; 结论&#xff1a;SparkSQL 是一个即支持 SQL 又支持命令式数据处理的工具 2、SparkSQL 的适用场景&#xff1f; 结论&#xff1a;SparkSQL 适用于处理结构化数据的场景&#xff0c;而Spark 的 RDD 主要用于处理 非结构化数据 和 半结构化数据 …

掌握ASPICE标准:汽车软件测试工程师的专业发展路径

掌握ASPICE标准&#xff1a;汽车软件测试工程师的专业发展路径 文&#xff1a;领测老贺 随着新能源汽车在中国的蓬勃发展&#xff0c;智能驾驶技术的兴起&#xff0c;汽车测试工程师的角色变得愈发关键。这一变革带来了前所未有的挑战和机遇&#xff0c;要求测试工程师不仅要具…

解决git克隆项目出现fatal无法访问git clone https://github.com/lvgl/lvgl.git

Windows 11系统 报错 $ git clone https://github.com/lvgl/lvgl.git Cloning into lvgl... fatal: unable to access https://github.com/lvgl/lvgl.git/: Failed to connect to github.com port 443 after 21141 ms: Couldnt connect to server 解决方法 git运行这两段代码…

创新实训2024.05.26日志:落地基于硬盘的数据库服务

1. 需求任务列表 以下描述易学大模型软件的web应用的功能。 用户注册 用户邮箱&#xff0c;密码&#xff0c;验证码开启官方邮箱&#xff0c;用来发验证码&#xff08;QQ 网易都支持开启smtp协议&#xff0c;找教程&#xff0c;用邮箱不用手机号是为了省买发短信云服务的钱&a…

ASP+ACCESS客户管理信息系统

摘要 本文介绍了客户管理系统的实现方法。目的在于让大家共享学习和运用这一语言的体会和收获。本系统是Internet/Intranet环境下面向电子商务的客户管理&#xff0c;通过企业管理技术、电子商务和信息技术的高度集成&#xff0c;讨论了客户管理系统的系统构架、系统的工作…

栈和队列的基本见解

1.栈 1.1栈的基本概念和结构&#xff1a; 栈是一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶&#xff0c;另一端称为栈底。栈中的数据元素遵守后进先出的原则。 压栈&#xff1a;栈的插入操作叫做进栈/压栈…

python 面对对象 类 魔法方法

魔法方法 一、__init__ 构造函数&#xff0c;可以理解为初始化 触发条件&#xff1a;在实例化的时候就会触发 class People():def __init__(self, name):print(init被执行)self.name namedef eat(self):print(f{self.name}要吃饭)a People(张三) a.eat() # in…

海外抖音TK自动挂机,手机全自动挂机,每天轻松搞2张

海外抖音TK自动挂机&#xff0c;手机全自动挂机&#xff0c;每天轻松搞2张 课程获取方式&#xff1a; https://zzmbk.com/