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

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.mzph.cn/news/229863.shtml

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

相关文章

音画欣赏|《红尘入戏》

《红尘入戏》 46X68cm 陈可之2023年绘 《秋月》 【宋】朱熹 清溪流过碧山头,空水澄鲜一色秋。 隔断红尘三十里,白云红叶两悠悠。 《白日偶无客青山长对门》其四 【宋】韩淲 人生等戏剧,衮衮徒区区。 老身其回头,今有古非无。 -…

Kafka相关知识

一、kafka架构 Kafka基础知识 Kafka是最初由Linkedin公司开发,是一个分布式、分区的、多副本的、多生产者、多订阅者,基于zookeeper协 调的分布式日志系统(也可以当做MQ系统),常见可以用于webynginx日志、访问日志,消息服务等等&…

Arma3/武装突袭3东风战役最后一关游戏无法保存的解决办法

Arma3这个游戏玩进去还是非常有可玩性的,可是在玩过了它本体自带的东风系列战役后,在最精髓的最后一关——game over这个关卡,却有个非常头疼的问题。 逃跑其实是非常简单的,但是想要无伤环游全岛确十分困难,因为这关卡…

游戏运行中突然掉线是什么原因导致的

游戏平稳运行的原因只有一个,掉线的原因各有个的不同。这些不同的原因有常见,也有不常见的。但不管出于什么原因的掉线,带来的损失又是相同的。 首先最常见的原因就是攻击造成的 像CC,DDOS。CC会造成服务器资源的浪费&…

超详细教程:使用React实现动态轮播图

前言 轮播组件是常见的一种方式,用来展示图像、信息或者是广告。我们可以使用React来创建一个轮播组件,并且利用其中的State和effect Hook来创建一款动态的、可以自动播放的轮播组件。 效果 轮播组件会展示一个平铺的图片列表。在图片列表下方是一组小…

Missing artifact org.wltea.analyzer:ik-analyzer:jar:5.0

没有找到【org.wltea.analyzer】 找到了【org.wltea.ik-analyzer】 https://github.com/wks/ik-analyzer https://github.com/wks/ik-analyzer.git https://code.google.com/archive/p/ik-analyzer/downloads?page2 C:\Users\Administrator\Desktop\ik-analyzer-master>m…

【Hive_03】单行函数、聚合函数、窗口函数、自定义函数、炸裂函数

1、函数简介2、单行函数2.1 算术运算函数2.2 数值函数2.3 字符串函数(1)substring 截取字符串(2)replace 替换(3)regexp_replace 正则替换(4)regexp 正则匹配(5&#xff…

机器学习---模型评估

1、混淆矩阵 对以上混淆矩阵的解释: P:样本数据中的正例数。 N:样本数据中的负例数。 Y:通过模型预测出来的正例数。 N:通过模型预测出来的负例数。 True Positives:真阳性,表示实际是正样本预测成正样…

自然语言处理阅读第二弹

HuggingFace 镜像网站模型库 NLP中的自回归模型和自编码模型 自回归:根据上文内容预测下一个可能的单词,或者根据下文预测上一个可能的单词。只能利用上文或者下文的信息,不能同时利用上文和下文的信息。自编码:对输入的句子随…

解决Qt UI界面卡顿的优化方法

以下是一些常见的Qt界面卡顿优化方法: 使用多线程:将耗时操作放在后台线程中执行,避免阻塞主线程。减少界面刷新频率:只在必要时进行界面更新,避免频繁的重绘。使用异步加载:对于大量数据的加载,可以采用异步加载的方式,逐步显示数据,减少界面卡顿感。减少布局计算量:…

7.26 SpringBoot项目实战【还书】

文章目录 前言一、编写控制器二、编写服务层三、Git提交前言 本文是项目实战 业务接口 的最后一篇,上文 曾说过【还书】的 入口是【我的借阅记录】,因为【还书】是基于一次借阅记录而言,另外在4.2 数据库设计 曾分析过【还书】的业务场景,需要执行两步操作: 更新【借阅记…

后端低代码平台探索总结

业务需求快速变化的背景 我们在对业务需求进行梳理后,在进行程序设计时,对于将来可能发生变化的常量、变量、阀值、开关、条件、公式等等,可能会配置在环境变量或数字字典来支持可配置。但是需求变化往往会更加复杂、更加不可预测&#xff0…

鸿蒙开发之用户隐私权限申请

一、简介 鸿蒙开发过程中可用于请求的权限一共有两种:normal和system_basic。以下内容摘自官网: normal权限 normal 权限允许应用访问超出默认规则外的普通系统资源。这些系统资源的开放(包括数据和功能)对用户隐私以及其他应用带…

C# 命令行参数解析库示例

写在前面 在日常开发中,我们经常会用到命令行参数,比如cmd下的各种指令;还有C#的控制台类型的项目,在默认入口Main函数中,那个args参数,就是有系统传入到程序进程的命令行参数;在传入的参数相对…

STM32/STM8资源节约主义设计方式

STM32/STM8资源节约主义设计方式 在小资源芯片进行代码设计时,如STM32C0系列,STM8系列,因为官方库本身要包含各种场景应用特征的支持,所以会有一些冗余的代码占用更多FLASH空间。当需要实现资源占用最简化设计方式时,…

剑指offer A + B

剑指offer A B 题目 输入两个整数,求这两个整数的和是多少。 输入格式 输入两个整数A,B,用空格隔开,0≤A,B≤10的8次幂 输出格式 输出一个整数,表示这两个数的和 样例输入: 3 4样例输出: 7参考答…

SQL基础:表的基本操作

上一节中,我们进行了学习环境的搭建。这一节我们来学习一下表的基本操作。 表是关系型数据库的基本组成部分,所有的数据都以表的形式进行组织。而表又由列构成,所以我们要先说明一下列。 列 列列名列的数据类型。列名一般用于描述所存储的…

什么是容器化?容器化如何工作?

什么是容器化?容器化有哪些优势?容器化有哪些使用案例?容器化如何工作?参考 什么是容器化? 容器化是一种软件部署流程。在传统场景中,要在计算机上运行任何应用程序,必须安装与计算机操作系统匹…

matlab实现单精度、16进制之间的转换函数

matlab 单精度转16进制:num2hex(single(1.0)) matlab16进制转单精度浮点型:typecast(uint32(hex2dec(‘3f000000’)),‘single’) 相关使用连接: https://blog.csdn.net/jxls378816/article/details/109071569 https://blog.csdn.net/sangba…

Spring Boot i18n中文文档

本文为官方文档直译版本。原文链接 Spring Boot 支持本地化消息,因此您的应用程序可以满足不同语言偏好的用户。默认情况下,Spring Boot 会在类路径的根目录下查找是否存在消息资源包。 自动配置适用于已配置资源包的默认属性文件(默认为 mes…