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

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

示例1:

给定二叉树[3,9,20,null,null,15,7],返回true

3

/

9 20

/

15 7

示例2:

给定二叉树[1,2,2,3,3,null,null,4,4],返回false

1

/

2 2

/

3 3

/

4 4

从底至顶(提前终结法)

1、对二叉树做深度优先遍历DFS,递归过程中:

1.1、终止条件:当DFS越过叶子节点时,返回高度0;

1.2、返回值:

1.2.1、从底至顶,返回以每个节点root为根节点的子树最大高度(左右子树中最大的高度值加1max(left,right) + 1);

1.2.2、当我们发现有一例 左/右子树高度差 > 1 的情况时,代表此树不是平衡树,返回-1;

1.3、当发现不是平衡树时,后面的高度计算完全没有意义,因此直接返回-1,避免后续过多的计算。

2、最差情况是对树做一遍完整DFS,时间复杂度为O(N)。

public boolean isBalanced(TreeNode root) {

return depth(root) != -1;

}

private int depth(TreeNode root) {

if (root == null) return 0;

int left = depth(root.left);

if(left == -1) return -1;

int right = depth(root.right);

if(right == -1) return -1;

return Math.abs(left - right) < 2 ? Math.max(left, right) + 1 : -1;

}

从顶至底(暴力法)

1、构造一个获取当前节点最大深度的方法 depth() ,通过比较左右子树最大高度差abs(self.depth(root.left) - self.depth(root.right)),来判断以此节点为根节点下是否是二叉平衡树;

2、从顶至底DFS,以每个节点为根节点,递归判断是否是平衡二叉树:

2.1、若所有根节点都满足平衡二叉树性质,则返回 True ;

2.2、若其中任何一个节点作为根节点时,不满足平衡二叉树性质,则返回False。

3、本方法产生大量重复的节点访问和计算,最差情况下时间复杂度 O(N^2)

public boolean isBalanced(TreeNode root) {

if (root == null) return true;

return Math.abs(depth(root.left) - depth(root.right)) <= 1 && isBalanced(root.left) && isBalanced(root.right);

}

private int depth(TreeNode root) {

if (root == null) return 0;

return Math.max(depth(root.left), depth(root.right)) + 1;

}

两者思想上都类似,可能大家对于树类型相关的题一直都很头大,每次都是一看答案都会,自己动手持续懵逼,所以更要注重平时练习和学习,痛苦一段时间,理解之后就会发现还蛮有意思的。

辛苦各位大佬看完,不胜感激,有兴趣的可以关注公众号,内容持续更新发力,收获满满,也可以微信私信,共同学习。

平衡二叉树的构造_LeetCode-平衡二叉树相关推荐

  1. 平衡二叉树的构造_LeetCode 题解 | 110.平衡二叉树

    点击上方蓝字设为星标 每周一.三.五上午 8:30 准时推送 下面开始今天的学习- 力扣题解 自题解功能上线以来 题解区涌现了很多优质题解 如果你有更好的解题思路 不如来题解区大显身手 你可获得 1. ...

  2. 高度平衡二叉树的构建_平衡二叉树(AVL)树

    1.平衡二叉树定义 是一种二叉排序树(二叉查找树.二叉搜索树),其中每个节点的左子树和右子树的高度差不大于1.(左右子树也是平衡二叉树) 平衡因子BF = 二叉树节点的左子树深度减去右子树深度 = 节 ...

  3. 高度平衡二叉树的构建_平衡二叉树 构造方法(绝妙)

    构造方法 平衡二叉树 对于二叉查找树,尽管查找.插入及删除操作的平均运行时间为 O(logn) ,但是它们的最差 运行时间都是 O(n), 原因在于对树的形状没有限制. 平衡二叉树又称为 AVL 树, ...

  4. b - 数据结构实验之查找二:平衡二叉树_二叉树、平衡二叉树、红黑树、B树、B+树与B*树...

    一.二叉树 1️⃣二叉查找树的特点就是左子树的节点值比父亲节点小,而右子树的节点值比父亲节点大,如图: 基于二叉查找树的这种特点,在查找某个节点的时候,可以采取类似于二分查找的思想,快速找到某个节点. ...

  5. 牛客国庆集训派对Day2 F、平衡二叉树 【构造+记忆化搜索】

    任意门:https://www.nowcoder.com/acm/contest/202/F 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 1048576K,其他语言2097152K ...

  6. 平衡二叉树的构造c语言,平衡二叉树(C语言,又称AVL树,实现LeftBalance,RightBalance)...

    1. 背景 因为二叉排序树在平衡的情况下查询效率最佳,AVL树让二叉排序树节点变动后维持平衡(左子树高度-右子树高度 差的绝对值<2) 2. 算法原理 根据节点的平衡因子及插入结果,实际修正二叉 ...

  7. 平衡二叉树删除_自平衡二叉树实现及时间复杂度分析

    平衡二叉树的实现 我们在遍历二叉树时,先一直往左遍历,于是我们发现,当一棵树的每个节点都只有一个子节点时,他就变成了一个链表,然后链表就说啊: ❝ 年轻人你不要过度消费我,这好吗?这不好. ❞ 所以我 ...

  8. 高度平衡二叉树的构建_平衡二叉树建立及其增删改查(JAVA)

    平衡二叉树:指的是左右子树高度差的绝对值不超过一的二叉排序树. 主要思路:1.用左高度跟右高度代替平衡因子,大于1进行L~调整,小于-1进行R~调整 2.每次插入都通过递归计算一次各结点高度,然后进行 ...

  9. 带父节点的平衡二叉树_数据结构(八)平衡二叉树

    该来的总会来,平衡二叉树果然又来了.... 出现背景 前文已经研究过普通的二叉树, 为什么要用二叉树呢?因为二叉树的结构可以实现二分法查找的效果. 你比如前文介绍的满二叉树:如下图所示, 如果你想要查 ...

最新文章

  1. c语言 dll注入,教大家写一个远程线程的DLL注入,其实还是蛮简单的……………………...
  2. Linux C编程--线程操作1--线程概述和简单的线程操作
  3. 五十音图平假名流氓记忆(MD~!真难)
  4. bayes python 源代码
  5. 65. Leetcode 153. 寻找旋转排序数组中的最小值 (二分查找-局部有序)
  6. 你不会知道,一个小小电阻也很奇妙!
  7. python3中文教程_Python视频教程:Python3入门+进阶让你快速掌握Python3
  8. 微软研究院研究员Ryan Beckett 博士论文《Network Control Plane Synthesis and Verification》下载—2018ACM最佳博士论文题目奖
  9. UI设计素材模板|社交新媒体,可编辑套件
  10. Android卡片设置透明度失效问题
  11. Git异常:fatal: V1.0 cannot be resolved to branch.
  12. CV学习笔记-BP神经网络代码Python实例
  13. Student数据库创建
  14. [转] 脉宽调制实现LED显示屏灰度的方法
  15. 从奥卡姆剃刀定律再看决策树
  16. 【深度学习】数据读取与数据扩增方法
  17. eap wifi 证书_用openssl为EAP-TLS生成证书(CA证书,服务器证书,用户证书)
  18. arping 的特殊用法
  19. StudyFlutter——我的第一个APP
  20. ajax回调方法名使用什么事件,ajax的回调函数和匿名函数

热门文章

  1. python的序列化是什么意思_python 什么是对象序列化
  2. 如何在IDEA 中使用Git
  3. 微信小程序设置启动图时出现滚动条
  4. VS中生成时“sgen.exe”已退出,代码为 1解决办法
  5. 如何选择正确的HTTP状态码
  6. mysql Partition(分区)初探
  7. KDE Akademy 2008 会议
  8. $(document).ready() 和 window.onload 的区别
  9. C语言结构体实现类似C++的构造函数
  10. JMS学习七(ActiveMQ之Topic的持久订阅)