平衡二叉树,力扣

目录

前序遍历与后续遍历

题目地址:

题目:

我们直接看题解吧:

审题目+事例+提示:

解题方法:

难度分析:

解题方法分析:

解题分析:

解题思路:

代码实现:

补充说明:

代码进一步优化:

代码实现(自顶向下) :


前序遍历与后序遍历

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

二叉树的前序遍历,力扣-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.mzph.cn/news/594759.shtml

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

相关文章

【每日论文阅读】生成模型篇

联邦多视图合成用于元宇宙 标题: Federated Multi-View Synthesizing for Metaverse 作者: Yiyu Guo; Zhijin Qin; Xiaoming Tao; Geoffrey Ye Li 摘要: 元宇宙有望提供沉浸式娱乐、教育和商务应用。然而&#xff0c;虚拟现实&#xff08;VR&#xff09;在无线网络上的传输是…

【UEFI基础】EDK网络框架(通用函数和数据)

通用函数和数据 DPC DPC全称Deferred Procedure Call。Deferred的意思是“延迟”&#xff0c;这个DPC的作用就是注册函数&#xff0c;然后在之后的某个时刻调用&#xff0c;所以确实是有“延迟”的意思。DPC在UEFI的实现中包括两个部分。一部分是库函数DxeDpcLib&#xff0c;…

Unity中使用四元数乘法表示旋转

四元数乘法旋转的本质是旋转的连续应用。当你执行p * q时&#xff0c;可以理解为首先应用四元数p的旋转&#xff0c;然后再应用四元数q的旋转。 四元数旋转乘法主要分为全局坐标的旋转和局部坐标的旋转. 全局坐标下的旋转&#xff1a; transform.rotationtransform.roation*…

考研复试英语口语问答举例第一弹

考研复试英语口语问答举例第一弹 文章目录 考研复试英语口语问答举例第一弹Question &#xff1a;介绍你的读研兴趣与动机Answer1&#xff1a;&#xff08;医疗与人工智能结合方向&#xff09;Answer2&#xff1a;&#xff08;分布式与网安方向&#xff09;Answer3&#xff1a;…

AUTOSAR规范与ECU软件开发(基础篇)1.2 汽车电子控制系统的基本构成

目录 前言 1、 传感器 2、 电子控制单元(ECU) 3、 执行器 前言 汽车电子控制系统主要由传感器(Sensor) 、 电子控制单元(Electronic Control Unit, ECU) 和执行器(Actuator) 组成(图1.1) ,对被控对象(Controlled Object) 进行控制。

斐波那契数列指的是这样一个数列 0, 1, 1, 2, 3,

斐波那契数列指的是这样一个数列 0, 1, 1, 2, 3, 5, 8, 13,特别指出&#xff1a;第0项是0&#xff0c;第1项是第一个1。从第三项开始&#xff0c;每一项都等于前两项之和。 Python 实现斐波那契数列代码如下&#xff1a; 实例(Python 3.0) # -*- coding: UTF-8 -*- # File…

JS和TS的基础语法学习以及babel的基本使用

简介 本文主要介绍了一下js和ts的基础语法,为前端开发zuo JavaScript 更详细的 JavaScript 学习资料&#xff1a;https://developer.mozilla.org/zh-CN/docs/Web/JavaScript 简介 定位 : JavaScript 是一种动态语言&#xff0c;它包含类型、运算符、标准内置&#xff08; bu…

数字IC设计——数字电路基本元器件

现代数字集成电路基本由CMOS晶体管构成&#xff0c;而CMOS门电路由PMOS场效应管和NMOS场效应管以对称互补的形式组成&#xff0c;所谓“互补”&#xff0c;即利用互补型MOSFET&#xff0c;即pMOS和nMOS&#xff0c;二者成对出现构成互补电路。 这种电路具有高的电路可靠性和抗干…

Mysql show Profiles详解

1.简介 show profile 和 show profiles 命令用于展示SQL语句的资源使用情况&#xff0c;包括CPU的使用&#xff0c;CPU上下文切换&#xff0c;IO等待&#xff0c;内存使用等&#xff0c;这个命令对于分析某个SQL的性能瓶颈非常有帮助&#xff0c;借助于show profile的输出信息&…

力扣hot100 二叉树的直径

&#x1f468;‍&#x1f3eb; 题目地址 一个节点的最大直径 它左树的深度 它右树的深度 &#x1f60b; AC code /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* Tr…

(基础篇)go常用使用场景三(死锁的场景及处理)

目录 一、通道的发送和接收不匹配 二、没有足够的机会让 goroutine 执行完成 三、资源竞争

[Android]RadioButton控件

RadioButton控件 RadioButton控件是单选按钮控件&#xff0c;它继承自Button控件&#xff0c;可以直接使用Button控件支持的各种属性和方法。 与普通按钮不同的是&#xff0c;RadioButton控件多了一个可以选中的功能&#xff0c;能额外指定一个android&#xff1a;checked属性…

手机视频监控客户端APP如何实现跨安卓、苹果和windows平台,并满足不同人的使用习惯

目 录 一、手机视频监控客户端的应用和发展 二、手机视频监控客户端存在的问题 三、HTML5视频监控客户端在手机上实现的方案 &#xff08;一&#xff09;HTML5及其优点 &#xff08;二&#xff09;HTML5在手机上实现视频应用功能的优势 四、手机HTML5…

Micropython的包管理

MicroPython包支持多种管理和安装方式&#xff0c;本文主要mip、mpremote以及手动安装包的方式&#xff0c;另外也会说明下如何发布自己的包。 使用**mip**安装包 mip&#xff08;“mip installs packages”&#xff09;是一个跟Python pip概念类似的工具&#xff0c;但它不使…

【数据结构】循环队列(数组实现)

目录 一、循环队列定义 怎么使一个数组在逻辑上呈“环状”呢&#xff1f; 二、循环队列与顺序队列的差异 1、存储方式: 2、操作方式: 3、空间利用率&#xff1a; 4、循环队列判断队空的方式&#xff1a; 5、循环队列判断队满的方式 完整测试代码及注释&#xff1a; 总…

axure RP9.0安装字体图标库fontawesome

字体图库地址: Font AwesomeThe internets icon library toolkit. Used by millions of designers, devs, & content creators. Open-source. Always free. Always awesome.https://fontawesome.com/v6/download进入后下载想要的版本如我是6.3 下载后得到压缩包,解压之后…

机器学习笔记 - 从2D数据合成3D数据

一、3D 数据简介 人们一致认为,从单一角度合成 3D 数据是人类视觉的一项基本功能,这对计算机视觉算法来说极具挑战性。但随着 LiDAR、RGB-D 相机(RealSense、Kinect)和 3D 扫描仪等 3D 传感器的可用性和价格的提高,3D 采集技术的最新进展取得了巨大飞跃。 与广泛使用的 2D…

数据库中的MVCC--多版本并发控制

一、前言 1、定义&#xff1a;MVCC&#xff08;Multi-Version Concurrency Control&#xff09;&#xff0c;多版本并发控制&#xff0c;主要为了提高数据库 的并发性能。是MySQL的InnoDB存储引擎实现隔离级别的一种具体方式。用于实现提交读和可重 复读这两种隔离级别。 2…

【重点】【单调栈】【循环数组】503.下一个更大元素 II

题目 法1&#xff1a;单调栈循环数组 class Solution {public int[] nextGreaterElements(int[] nums) {int n nums.length;int[] res new int[n];Stack<Integer> stack new Stack<>();for (int i 2 * n - 1; i > 0; --i) { // 循环数组处理!!!while (!st…

Mybatis-Plus乐观锁配置使用流程【OptimisticLockerInnerInterceptor】

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家:人工智能学习网站 1.乐观锁实现 1.配置插件 1.XML方式 <bean class"com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerI…