平衡二叉树,力扣

目录

前序遍历与后续遍历

题目地址:

题目:

我们直接看题解吧:

审题目+事例+提示:

解题方法:

难度分析:

解题方法分析:

解题分析:

解题思路:

代码实现:

补充说明:

代码进一步优化:

代码实现(自顶向下) :


前序遍历与后序遍历

下面方法需要用,大家不太熟或者想加强一下可以先刷一下

二叉树的前序遍历,力扣-CSDN博客

二叉树的后序遍历,力扣-CSDN博客

题目地址:

110. 平衡二叉树 - 力扣(LeetCode)

难度:简单


乍一看以为有点难,其实仔细理解一下,发现还行,大家可以简单看一下解题思路,然后再照着代码看,会更容易理解一些。

今天刷平衡二叉树,大家有兴趣可以点上面链接,看看题目要求,试着做一下。

题目:

给定一个二叉树,判断它是否是高度平衡的二叉树。

注:本题高度平衡二叉树定义为一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 

我们直接看题解吧:

审题目+事例+提示:

平衡二叉树的定义:

二叉树的每个节点的左右子树的高度差的绝对值不超过1。

   注:空树也可以作为平衡二叉树

 性质:当前树的深度等于左子树深度与右子树的深度中的最大值+1

解题方法:

根据定义可知,一棵若为平衡二叉树,当且仅当其所右子树也都是平衡二叉树,

因此可以用递归的方法。

方法1、自顶向下递归

方法2、自底向上递归

难度分析:

主要考察树及二叉树的相关基础,对于初学者来说,方法2需要打破思维限制可能难一点

解题方法分析:

方法1,我们可能比较容易想得到,但是它不是最优的。

简单说一下思路:

具体做法类似于二叉树的前序遍历,即对于当前遍历到的节点,首先计算左右子树的高度,如果左右子树的高度差是否不超过 1,再分别递归地遍历左右子节点,并判断左子树和右子树是否平衡。

这是一个自顶向下的递归的过程。它最大的问题是会产生重复计算,对于同一个节点,用于计算二叉树高度的函数 height() 会被重复调用,导致时间复杂度较高。

但如果使用自底向上的做法,则对于每个节点,函数 height() 只会被调用一次,因此,下面着重讲一下方法2.

解题分析:

自底向上递归的做法类似于后序遍历,对于当前遍历到的节点,先递归地判断其左右子树是否平衡,再判断以当前节点为根的子树是否平衡。如果一棵子树是平衡的,则返回其高度(高度一定是非负整数),否则返回−1。如果存在一棵子树不平衡,则整个二叉树一定不平衡。

解题思路:

1、在函数isBalanced()中,调用height()参数为树根节点root,若最终返回值>=0,则说明此树平衡,即返回true,反之返回false。

2、创建用于计算二叉树高度的函数height(root)

               ·判断根节点是否为空,空则返回0

                ·分别递归调用函数height()获取当前节点左右子树的高度

                 `判断其左右子树高度是否为-1,或者左右子树绝对值之差大于1,满足则返回-1

                                                                                若不满足,则返回其左右子树最大值+1

代码实现:

class Solution {public boolean isBalanced(TreeNode root) {return height(root) >= 0;//若最终返回值不等于-1,则说明此树平衡,即返回true,反之返回 //                                               false。}public int height(TreeNode root) {//创建用于计算二叉树高度的函数height(root)if (root == null) {return 0;           //判断根节点是否为空,空则返回0}int leftHeight = height(root.left);//递归调用函数height()获取当前节点左子树的高度int rightHeight = height(root.right);//递归调用函数height()获取当前节点右子树的高度if (leftHeight == -1 || rightHeight == -1 || Math.abs(leftHeight - rightHeight) > 1) {     //判断其左右子树高度是否为-1,或者左右子树绝对值之差大于1return -1; //满足则返回-1} else {//若不满足,则返回其左右子树最大值+1return Math.max(leftHeight, rightHeight) + 1;}}
}
补充说明:

第一次调用函数时,若根节点为空,则整棵树为空树了 

代码进一步优化:

如果左子树已经返回-1了就不需要再递归右子树了,直接返回-1

class Solution {public boolean isBalanced(TreeNode root) {return balanced(root) != -1;}private int balanced(TreeNode node) {if (node == null) return 0;int leftHeight, rightHeight;if ((leftHeight = balanced(node.left)) == -1//如果左子树已经返回-1了就不需要再递归右子树了,直接返回-1|| (rightHeight = balanced(node.right)) == -1|| Math.abs(leftHeight - rightHeight) > 1)return -1;return Math.max(leftHeight, rightHeight) + 1;}
}

代码实现(自顶向下) :

class Solution {public boolean isBalanced(TreeNode root) {if (root == null) {return true;} else {return Math.abs(height(root.left) - height(root.right)) <= 1 && isBalanced(root.left) && isBalanced(root.right);}}public int height(TreeNode root) {if (root == null) {return 0;} else {return Math.max(height(root.left), height(root.right)) + 1;}}
}

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

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

相关文章

JavaScript中BOM操作【通俗易懂】

✨前言✨   本篇文章主要在于了解JavaScript中BOM(即浏览器对象模型),以及对它的简单使用 &#x1f352;欢迎点赞 &#x1f44d; 收藏 ⭐留言评论 &#x1f4dd;私信必回哟&#x1f601; &#x1f352;博主将持续更新学习记录收获&#xff0c;友友们有任何问题可以在评论区留…

如何压缩图片?电脑图片压缩的方法

如果图片体积过大不仅会占用过多的内存&#xff0c;还容易在平时处理和上传的时候被限制&#xff0c;传输起来也比较慢&#xff0c;这个时候最简单的方法就是通过专业的图片处理工具压缩图片大小&#xff0c;现如今有许多在线处理工具可以选择&#xff0c;今天分享的压缩图就是…

NSSCTF sql

开启环境: ?wllm1 回显正常,试试?wllm1 出现报错;加上%23正常 ?wllm-1or 11%23出现过滤 测试,空格用**替代, 等号用like替代 测试长度 ?wlmm1order/**/by/**/3%23正常 ?wlmm1order/**/by/**/4%23报错 长度为3,测试回显位置: ?wlmm-1union/**/select/**/1,2,3%23 …

技术扫盲:如何优雅的使用 java -jar

java -jar xxx.jar java -jar 是一个用于在命令行界面中执行 Java 可执行 JAR 文件的命令。它的语法如下&#xff1a; java -jar <JAR 文件路径> [参数]其中&#xff1a; java 是 Java 运行时环境的可执行文件。-jar 是一个选项&#xff0c;表示要执行的文件是一个 JA…

【项目部署】vue项目部署xshell使用Nginx了解

vue项目部署 一般来说&#xff0c;前端只需要把代码使用npm run build 或者其它类似的自定义指令将代码进行打包&#xff0c;并提供给后端&#xff0c;就可以了。&#xff08;如有问题再配合修改&#xff09; 但学一些运维相关的知识&#xff0c;能让前端更好排查问题&#xf…

关于对物料计量单位的维护

1、业务背景 一般情况下&#xff0c;在设计产品时&#xff0c;明确了物料的计量单位&#xff0c;并在维护物料主数据时&#xff0c;维护完整单位数据。 但也有例外情况&#xff0c;例如当设计产品时&#xff0c;不明确未来的打包方式&#xff0c;不明确要维护哪些种计量单位&…

如何把照片多余的地方擦除?一键消除图片上的瑕疵,简单又轻松,太方便了

在数字繁荣的时代&#xff0c;图片处理已然成为我们生活乐章中不可或缺的一部分&#xff0c;就如画师手中的画笔般灵动&#xff0c;摄影师镜头下的世界般多彩。然而&#xff0c;在捕捉或获取这些美丽的图片时&#xff0c;可能会不小心闯入一些不速之客&#xff0c;给画面带来瑕…

软件设计开发规程

目的在于为需求设计、开发、实现解决方案。根据适当情况&#xff0c;解决方案、设计和实现包括单独的产品、产品组件以及产品相关的生命周期的过程&#xff0c;或者它们的组合&#xff0c;以及包括如何利用准则进行接口设计。 软件开发、设计、实施、运维、投标、验收、售后等全…

物流实时数仓:数仓搭建(DWS)一

系列文章目录 物流实时数仓&#xff1a;采集通道搭建 物流实时数仓&#xff1a;数仓搭建 物流实时数仓&#xff1a;数仓搭建&#xff08;DIM&#xff09; 物流实时数仓&#xff1a;数仓搭建&#xff08;DWD&#xff09;一 物流实时数仓&#xff1a;数仓搭建&#xff08;DWD&am…

【LeetCode每日一题】466. 统计重复个数

2024-1-2 文章目录 [466. 统计重复个数](https://leetcode.cn/problems/count-the-repetitions/)思路&#xff1a; 466. 统计重复个数 思路&#xff1a; ​ s1表示要重复的序列。n1表示要重复s1的次数。 ​ s2表示要判断的子序列。n2表示子序列s2在整个序列中重复的次数。返回…

2024年阿里云优惠券领取及使用教程

阿里云作为国内领先的云计算服务提供商&#xff0c;一直致力于为客户提供优质、高效的服务。为了更好地回馈客户&#xff0c;阿里云经常会推出各种优惠活动&#xff0c;其中就包括阿里云优惠券。本文将详细介绍如何领取及使用阿里云优惠券。 一、阿里云优惠券介绍 阿里云优惠券…

YOLOv5算法进阶改进(11)— 添加EMA注意力机制 | 基于跨空间学习的高效多尺度注意力模块

前言:Hello大家好,我是小哥谈。EMA(Exponential Moving Average)注意力机制是一种用于增强模型性能的注意力机制,它通过对模型的特征图进行加权平均来提取更有用的特征信息。具体来说,EMA注意力机制通过引入一个权重因子来调整特征图中每个位置的重要性,从而使模型能够更…