力扣刷题TOP101: 29.BM36 判断是不是平衡二叉树

ops/2024/12/15 1:09:40/

目录:

目的

思路

复杂度

记忆秘诀

python%E4%BB%A3%E7%A0%81-toc">python代码

目的:

输入一棵节点数为 n 二叉树,判断该二叉树是否是平衡二叉树。


思路

什么是平衡二叉树(AVL)?

  1. 每个节点的左子树和右子树的高度差不能超过 1
  2. 确保了在进行查找、插入和删除操作时,时间复杂度保持在O(log n),从而提高了数据处理的效率。

 举例子:

    1/ \2   3/ \
4   5

这个树是平衡二叉树:

  • 对于节点 1,它的左子树高度是 2,右子树高度是 1,差值是 1,符合平衡条件。
  • 对于节点 2,它的左子树高度是 1,右子树高度是 1,差值是 0,符合平衡条件。
  • 对于节点 3,它的左右子树都为空,高度差是 0,符合平衡条件。
      1/ 2   / 3   

这个树不是平衡二叉树:对于节点 1,它的左子树高度是 2,右子树高度是 0,差值是 2,超过了 1,违反了平衡条件,说明这棵树不平衡。


代码逻辑(递归深度优先搜索(DFS)):

  • 递归计算每个节点的子树高度:如果节点为空(None),那么高度为 0,并且认为空树是平衡的。

  • 递归计算左子树和右子树的高度

    • 先计算左子树的高度。如果左子树不平衡(返回值为 -1),直接返回 -1,表示树不平衡。
    • 接着计算右子树的高度。如果右子树不平衡(返回值为 -1),同样返回 -1
  • 检查当前节点是否平衡

    • 对于当前节点,检查左右子树高度差的绝对值是否大于 1。如果大于 1,则表示当前节点不平衡,返回 -1
  • 返回当前节点的高度

    • 如果当前节点平衡,则返回该节点的高度,节点高度等于左右子树高度的最大值 + 1。
  • 最终判断树是否平衡

    • 调用递归函数check_balance 对整个树进行判断。如果树的根节点返回的值不是 -1,则说明树是平衡的,返回 True。否则,返回 False

示例:

      1/ \2   3/ \4   5

递归过程:

  • 从根节点开始,检查节点 1:首先要检查左子树(节点 2)和右子树(节点 3)。

  • 检查节点 2:继续检查左子树(节点 4)和右子树(节点 5)。

  • 检查节点 4:节点 4 没有子节点,所以它的高度是 0。

  • 检查节点 5:节点 5 也没有子节点,它的高度是 0。

  • 回到节点 2

    • 左子树高度是 0(节点 4),右子树高度是 0(节点 5)。
    • abs(0 - 0) = 0,符合平衡条件,返回节点 2 的高度为 1max(0, 0) + 1)。
  • 检查节点 3:节点 3 没有子节点,所以它的高度是 0。

  • 回到根节点 1

    • 左子树高度是 1(节点 2),右子树高度是 0(节点 3)。
    • abs(1 - 0) = 1,符合平衡条件,返回节点 1 的高度为 2max(1, 0) + 1)。

所有节点的左右子树高度差都不超过 1,因此这棵树是平衡二叉树,最终返回 True


复杂度

  • 时间复杂度:O(n)

    • 对每个节点只进行了访问一次,其中 n 是树中的节点数。
  • 空间复杂度:O(h)

    • h 是树的高度。递归调用栈的最大深度为树的高度。
    • 在最坏情况下(树是单链状),空间复杂度为 O(n)
    • 在平均情况下,空间复杂度为 O(log n),如果树比较平衡的话。

记忆秘诀

  • 递归深度优先搜索计算每个节点的左右子树的高度。
  • 检查高度差是否小于等于1:如果某个子树不平衡,立即返回 -1 表示不平衡,若平衡则返回该子树的高度。

python%E4%BB%A3%E7%A0%81">python代码

python">class TreeNode:def __init__(self, x):self.val = xself.left = Noneself.right = Noneclass Solution:def IsBalanced_Solution(self, pRoot: TreeNode) -> bool:def check_balance(node):# 空树是平衡的,高度为 0if not node:return 0# 递归计算左右子树高度left_height = check_balance(node.left)if left_height == -1:  # 左子树不平衡return -1right_height = check_balance(node.right)if right_height == -1:  # 右子树不平衡return -1# 检查当前节点的平衡性if abs(left_height - right_height) > 1:return -1  # 当前节点不平衡# 返回当前节点的高度return max(left_height, right_height) + 1return check_balance(pRoot) != -1  # 如果返回值不是 -1,则树是平衡的

* 欢迎大家探讨新思路,能够更好的理解和记忆


http://www.ppmy.cn/ops/141965.html

相关文章

2024年NSSCTF秋季招新赛-WEB

The Beginning F12看源码,有flag http标头 黑吗喽 题目说要在发售时的0点0分,所以添加标头data Date: Tue, 20 Aug 2024 00:00:00 GMT然后改浏览器头 User-Agent: BlackMonkey曲奇就是Cookie cookieBlackMonkey这个一般就是Referer Referer:wukon…

oracle 取斜杠后字符

在Oracle中,可以使用SUBSTR和INSTR函数组合来取得斜杠后的字符。以下是一个示例SQL语句,它取得指定字段中最后一个斜杠后的所有字符: SELECT SUBSTR(column_name, INSTR(column_name, /, -1) 1) AS last_slash_after_char FROM table_name;…

暂停一下,给Next.js项目配置一下ESLint(Next+tailwind项目)

前提 之前开自己的GitHub项目,想着不是团队项目,偷懒没有配置eslint,后面发现还是不行。eslint的存在可以帮助我们规范代码格式,同时 ctrl s保存立即调整代码格式是真的很爽。 除此之外,团队使用eslint也是好处颇多…

go语言的成神之路-标准库篇-os标准库

一、权限 在操作系统(OS)中,标准库的权限管理是非常重要的,它确保了不同用户和进程能够安全地访问系统资源。以下是一些常见的权限概念和说明: 1.用户权限 用户ID(UID):每个用户在…

MySQL之数据库三大范式

一、什么是范式? 范式是数据库遵循设计时遵循的一种规范,不同的规范要求遵循不同的范式。 (范式是具有最小冗余的表结构) 范式可以 提高数据的一致性和 减少数据冗余和 更新异常的问题 数据库有六种范式(1NF/2NF/3NF…

手机使用笔记

文章目录 配置一键换机 手机玩的很菜,做个笔记,有时自己找着方便。 配置 怕手机的配置不够,要不要弄顶配。 实际如果不玩游戏,根本遇不到性能瓶颈,现在的芯片都这么强,应对办公和多开早就轻轻松松。 随便…

我在广州学 Mysql 系列之 数据“表”的基本操作

ℹ️大家好,我是😆练小杰,今天主要讲得是Mysql数据表的基本操作内容~~ 昨天讲了“Mysql 数据“库“的基本操作”~~ 想要了解更多🈶️MYSQL 数据库的命令行总结!!! “真相永远只有一个”——工藤…

根据契约进行分析--录像店案例研究01

Richard Mitchell 著,zhen_lei 译 本文包括录像店案例研究的一些片段,用来说明根据契约进行分析的原理。本文假定读者已经从其它渠道学习了一些关于根据契约进行分析的方法。 完整的一套模型可以写成一本书。这些选择的片段用来说明开发的某些方面&…