平衡二叉树的构造_LeetCode-平衡二叉树
描述:给定一个二叉树,判断它是否是高度平衡的二叉树。
本题高度平衡二叉树定义:一个二叉树每个节点的左右两个子树的高度差的绝对值不超过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-平衡二叉树相关推荐
- 平衡二叉树的构造_LeetCode 题解 | 110.平衡二叉树
点击上方蓝字设为星标 每周一.三.五上午 8:30 准时推送 下面开始今天的学习- 力扣题解 自题解功能上线以来 题解区涌现了很多优质题解 如果你有更好的解题思路 不如来题解区大显身手 你可获得 1. ...
- 高度平衡二叉树的构建_平衡二叉树(AVL)树
1.平衡二叉树定义 是一种二叉排序树(二叉查找树.二叉搜索树),其中每个节点的左子树和右子树的高度差不大于1.(左右子树也是平衡二叉树) 平衡因子BF = 二叉树节点的左子树深度减去右子树深度 = 节 ...
- 高度平衡二叉树的构建_平衡二叉树 构造方法(绝妙)
构造方法 平衡二叉树 对于二叉查找树,尽管查找.插入及删除操作的平均运行时间为 O(logn) ,但是它们的最差 运行时间都是 O(n), 原因在于对树的形状没有限制. 平衡二叉树又称为 AVL 树, ...
- b - 数据结构实验之查找二:平衡二叉树_二叉树、平衡二叉树、红黑树、B树、B+树与B*树...
一.二叉树 1️⃣二叉查找树的特点就是左子树的节点值比父亲节点小,而右子树的节点值比父亲节点大,如图: 基于二叉查找树的这种特点,在查找某个节点的时候,可以采取类似于二分查找的思想,快速找到某个节点. ...
- 牛客国庆集训派对Day2 F、平衡二叉树 【构造+记忆化搜索】
任意门:https://www.nowcoder.com/acm/contest/202/F 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 1048576K,其他语言2097152K ...
- 平衡二叉树的构造c语言,平衡二叉树(C语言,又称AVL树,实现LeftBalance,RightBalance)...
1. 背景 因为二叉排序树在平衡的情况下查询效率最佳,AVL树让二叉排序树节点变动后维持平衡(左子树高度-右子树高度 差的绝对值<2) 2. 算法原理 根据节点的平衡因子及插入结果,实际修正二叉 ...
- 平衡二叉树删除_自平衡二叉树实现及时间复杂度分析
平衡二叉树的实现 我们在遍历二叉树时,先一直往左遍历,于是我们发现,当一棵树的每个节点都只有一个子节点时,他就变成了一个链表,然后链表就说啊: ❝ 年轻人你不要过度消费我,这好吗?这不好. ❞ 所以我 ...
- 高度平衡二叉树的构建_平衡二叉树建立及其增删改查(JAVA)
平衡二叉树:指的是左右子树高度差的绝对值不超过一的二叉排序树. 主要思路:1.用左高度跟右高度代替平衡因子,大于1进行L~调整,小于-1进行R~调整 2.每次插入都通过递归计算一次各结点高度,然后进行 ...
- 带父节点的平衡二叉树_数据结构(八)平衡二叉树
该来的总会来,平衡二叉树果然又来了.... 出现背景 前文已经研究过普通的二叉树, 为什么要用二叉树呢?因为二叉树的结构可以实现二分法查找的效果. 你比如前文介绍的满二叉树:如下图所示, 如果你想要查 ...
最新文章
- c语言 dll注入,教大家写一个远程线程的DLL注入,其实还是蛮简单的……………………...
- Linux C编程--线程操作1--线程概述和简单的线程操作
- 五十音图平假名流氓记忆(MD~!真难)
- bayes python 源代码
- 65. Leetcode 153. 寻找旋转排序数组中的最小值 (二分查找-局部有序)
- 你不会知道,一个小小电阻也很奇妙!
- python3中文教程_Python视频教程:Python3入门+进阶让你快速掌握Python3
- 微软研究院研究员Ryan Beckett 博士论文《Network Control Plane Synthesis and Verification》下载—2018ACM最佳博士论文题目奖
- UI设计素材模板|社交新媒体,可编辑套件
- Android卡片设置透明度失效问题
- Git异常:fatal: V1.0 cannot be resolved to branch.
- CV学习笔记-BP神经网络代码Python实例
- Student数据库创建
- [转] 脉宽调制实现LED显示屏灰度的方法
- 从奥卡姆剃刀定律再看决策树
- 【深度学习】数据读取与数据扩增方法
- eap wifi 证书_用openssl为EAP-TLS生成证书(CA证书,服务器证书,用户证书)
- arping 的特殊用法
- StudyFlutter——我的第一个APP
- ajax回调方法名使用什么事件,ajax的回调函数和匿名函数
热门文章
- python的序列化是什么意思_python 什么是对象序列化
- 如何在IDEA 中使用Git
- 微信小程序设置启动图时出现滚动条
- VS中生成时“sgen.exe”已退出,代码为 1解决办法
- 如何选择正确的HTTP状态码
- mysql Partition(分区)初探
- KDE Akademy 2008 会议
- $(document).ready() 和 window.onload 的区别
- C语言结构体实现类似C++的构造函数
- JMS学习七(ActiveMQ之Topic的持久订阅)