力扣刷题-二叉树-平衡二叉树

110 平衡二叉树

给定一个二叉树,判断它是否是高度平衡的二叉树。
本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。
示例 1:
给定二叉树 [3,9,20,null,null,15,7]
image.png
返回 true 。
给定二叉树 [1,2,2,3,3,null,null,4,4]
image.png
返回 false 。

思路

参考:
https://www.programmercarl.com/0110.%E5%B9%B3%E8%A1%A1%E4%BA%8C%E5%8F%89%E6%A0%91.html#%E6%9C%AC%E9%A2%98%E6%80%9D%E8%B7%AF
强调一下概念:

  • 二叉树节点的深度:指从根节点到该节点的最长简单路径边的条数。
  • 二叉树节点的高度:指从该节点到叶子节点的最长简单路径边的条数。

但leetcode中强调的深度和高度很明显是按照节点来计算的,如图:
image.png
注意:leetcode的题目中都是以节点为一度,即根节点深度是1。
本题思路:

递归

此时大家应该明白了既然要求比较高度,必然是要后序遍历。
递归三步曲分析:

  1. 明确递归函数的参数和返回值

参数:当前传入节点。 返回值:以当前传入节点为根节点的树的高度。
那么如何标记左右子树是否差值大于1呢?
如果当前传入节点为根节点的二叉树已经不是二叉平衡树了,还返回高度的话就没有意义了。
所以如果已经不是二叉平衡树了,**可以返回-1 **来标记已经不符合平衡树的规则了。

def get_height(self, node): # 递归一: 传入当前节点(以当前节点为根节点) 返回值为int 就是子树高度
  1. 明确终止条件

递归的过程中依然是遇到空节点了为终止,返回0,表示当前节点为根节点的树高度为0

if not node:return 0 # 递归二:如果节点不存在 显然该节点的高度为0 
  1. 明确单层递归的逻辑

如何判断以当前传入节点为根节点的二叉树是否是平衡二叉树呢?当然是其左子树高度和其右子树高度的差值。
分别求出其左右子树的高度,然后如果差值小于等于1,则返回当前二叉树的高度,否则返回-1,表示已经不是二叉平衡树了。
严格按照 左右中 的写法 会更加清晰

# 单层递归逻辑 后序遍历思想 左右中 先分别求出其左右子树的高度
leftheight = self.get_height(node.left)
if leftheight == -1: # 采用-1表示非平衡了 左return -1
rightheight = self.get_height(node.right)
if rightheight == -1: # 采用-1表示非平衡了 右return -1
# 中
# 求左子树高度和其右子树高度的差值。分别求出其左右子树的高度,然后如果差值小于等于1,则返回当前二叉树的高度,否则返回-1
if abs(leftheight-rightheight) > 1: # 差值大于1return -1
else:return 1 + max(leftheight, rightheight) # 一棵子树高度

最终的 get_height 代码:

def get_height(self, node): # 递归一: 传入当前节点(以当前节点为根节点) 返回值为int 就是子树高度if not node:return 0 # 递归二:如果节点不存在 显然该节点的高度为0 # 单层递归逻辑 后序遍历思想 左右中 先分别求出其左右子树的高度leftheight = self.get_height(node.left)if leftheight == -1: # 采用-1表示非平衡了 左return -1rightheight = self.get_height(node.right)if rightheight == -1: # 采用-1表示非平衡了 右return -1# 中# 求左子树高度和其右子树高度的差值。分别求出其左右子树的高度,然后如果差值小于等于1,则返回当前二叉树的高度,否则返回-1if abs(leftheight-rightheight) > 1: # 差值大于1return -1else:return 1 + max(leftheight, rightheight) # 一棵子树高度

最后本题整体递归代码如下:

class TreeNode(object):def __init__(self, val=0, left=None, right=None):self.val = valself.left = leftself.right = rightclass Solution(object):def isBalanced(self, root):""":type root: TreeNode:rtype: bool"""# if not root:#     return True 下面的递归函数 已经包含了 if self.get_height(root) != -1: # 采用 -1 来标识return Trueelse:return False def get_height(self, node): # 递归一: 传入当前节点(以当前节点为根节点) 返回值为int 就是子树高度if not node:return 0 # 递归二:如果节点不存在 显然该节点的高度为0 # 单层递归逻辑 后序遍历思想 左右中 先分别求出其左右子树的高度leftheight = self.get_height(node.left)if leftheight == -1: # 采用-1表示非平衡了 左return -1rightheight = self.get_height(node.right)if rightheight == -1: # 采用-1表示非平衡了 右return -1# 中# 求左子树高度和其右子树高度的差值。分别求出其左右子树的高度,然后如果差值小于等于1,则返回当前二叉树的高度,否则返回-1if abs(leftheight-rightheight) > 1: # 差值大于1return -1else:return 1 + max(leftheight, rightheight) # 一棵子树高度

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

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

相关文章

LearnDash LMS ProPanel在线学习系统课程创作者的分析工具

点击阅读LearnDash LMS ProPanel在线学习系统课程创作者的分析工具原文 LearnDash LMS ProPanel在线学习系统课程创作者的分析工具通过整合报告和作业管理来增强您的 LearnDash 管理体验,使您能够发送特定于课程的通信,并显示课程的实时活动&#xff01…

Cheat Enginee(CE)详细使用指南

一,下载与安装 首先在CE的官网下载Cheat Engine的软件包,下载完成之后找到文件所在的位置,进入文件运行exe文件,这样就可以进入Cheat Engine的安装界面。进入安装界面后设置好安装路径点击Next即可安装。 或者通过下载压缩包&…

进程通信知识基础【Linux】——下篇

目录 前文 一,命名管道 创建命名管道 1. getline——c库 2. unlink——系统接口 实践代码 common.hpp client.cpp server.cpp Log.cpp 二,共享内存(system V接口) 1. 创建共享内存 shmget接口 2. 删除共享内存 常见…

C++经典面试题(万字总结版)

一.编译链接运行 1. 虚拟地址空间的内存布局 Linux内存管理 | 二、虚拟地址空间布局 - 知乎 (zhihu.com) 3G的用户空间和1G的内核空间。 用户态有:代码段、数据段、堆、栈、bss段、文件映射和匿名映射区 内核态有:安全保护区、固定映射区、…

SolidWorks二次开发 C#-读取基于Excel的BOM表信息

SolidWorks二次开发 C#-读取基于Excel的BOM表信息 问题点来源解决方案及思路相关引用链接 问题点来源 这是一位粉丝问的一个问题,他说到: 老师,请问Solidworks二次开发工程图中"基于Excel的材料明细表"怎么读取里面的数据? Ps:这…

基于ssm新锐台球厅管理系统的设计与实现论文

新锐台球厅管理系统 摘要 随着信息技术在管理上越来越深入而广泛的应用,作为一般的台球厅都会跟上时代的变化,用上计算机来代表重复性的劳动,并且给用户一种新奇的感受,实现新锐台球厅管理系统 在技术上已成熟。本文介绍了新锐台…

C++:函数重载

1.函数重载概念 函数重载就是用同一个函数名定义的不同函数,当函数名和不同的参数搭配时函数的功能和含义不同。 2.实现函数重载的条件 同一个作用域,参数个数不同或者参数类型不同或者参数顺序不同(满足一个即可) void func(){} void func(int x){} v…

EXCEL SUM类函数

参考资料 万能函数SUMPRODUCT超实用的10种经典用法 目录 一. SUM二. SUMIF2.1 统计贾1的销售额2.2 > 900 的销售总额2.3 计算贾1和贾22的销售总额2.4 多区域计算 三. SUMIFS3.1 统计苹果,在第一季度的总数量3.2 统计苹果,在第一季度,>…

2024最新FL Studio21.2MAC电脑版中文版下载安装步骤教程

FL Studio 简称FL,全称Fruity Loops Studio,因此国人习惯叫它"水果"。目前最新版本是FL Studio21.1.1.3750版本,它让你的计算机就像是全功能的录音室,大混音盘,非常先进的制作工具,让你的音乐突破…

SpringIOC之@Primary

博主介绍:✌全网粉丝5W,全栈开发工程师,从事多年软件开发,在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战,博主也曾写过优秀论文,查重率极低,在这方面有丰富的经验…

【动态读取配置文件】ParameterTool读取带环境的配置信息

不同环境Flink配置信息是不同的,为了区分不同环境的配置文件,使用ParameterTool工具读取带有环境的配置文件信息 区分环境的配置文件 三个配置文件: flink.properties:决定那个配置文件生效 flink-dev.properties:测…

mysql 中查询字段内容长度以及是否是纯数字的函数

1、字段内容长度查询 select * from abpusers where LENGTH(UserName)<4 结果&#xff1a; 2、 查询纯数字&#xff0c;使用正则表达式 select * from abpusers where UserName REGEXP ^[0-9]$ 结果如下&#xff1a;