【LeetCode二叉树#05】平衡二叉树
力扣题目链接(opens new window)](https://leetcode.cn/problems/balanced-binary-tree/)
给定一个二叉树,判断它是否是高度平衡的二叉树。
本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。
示例 1:
给定二叉树 [3,9,20,null,null,15,7]

返回 true 。
示例 2:
给定二叉树 [1,2,2,3,3,null,null,4,4]

返回 false
概念:平衡二叉树
平衡二叉搜索树:又被称为AVL(Adelson-Velsky and Landis)树,且具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。
如图:

最后一棵 不是平衡二叉树,因为它的左右两个子树的高度差的绝对值超过了1。
C++中map、set、multimap,multiset的底层实现都是平衡二叉搜索树,所以map、set的增删操作时间时间复杂度是logn,注意我这里没有说unordered_map、unordered_set,unordered_map、unordered_set底层实现是哈希表
思路
使用递归回溯的方式解决
既然涉及到了平衡二叉树,那么肯定与去高度计算有关,故需要使用后序遍历来做
因为求深度可以从上到下去查 所以需要前序遍历(中左右),而高度只能从下到上去查,所以只能后序遍历(左右中)
还是递归三部曲:
1、确定递归函数的参数和返回值
一般来说,我们希望:
参数是二叉树当前节点,返回值为以当前节点为根节点计算的高度

举个例子,假设传入节点是2,那么以2为根节点计算的二叉树的高度(红框中的)为3
但是如果当前传入节点为根节点的二叉树已经不是二叉平衡树了,还返回高度的话就没有意义了。
所以如果已经不是二叉平衡树了,可以规定返回-1 来标记已经不符合平衡树的规则了
再来更新一下参数和返回值:
参数是二叉树当前节点,返回值是 -1(不满足平衡二叉树时) 或 以当前节点为根节点计算的高度
// -1 表示已经不是平衡二叉树了,否则返回值是以该节点为根节点树的高度
int getHeight(TreeNode* node)
2、确定终止条件
如果传入的当前节点为空,那么当前树没有高度,递归行为也就应该终止
if (node == NULL) {
return 0;
}
3、明确单层递归逻辑
判断平衡二叉树的依据是当前节点(也就是根节点)的左右子树高度的差值
那么就得分别求出左右子树高度,然后求差值的绝对值,判断是否满足平衡条件
//明确单层处理逻辑
//递归计算当前节点的左子节点的高度
int leftHeight = getHeight(node->left);
//若发现不平衡,返回-1
if(leftHeight == -1)return -1;//左
//递归计算当前节点的左子节点的高度
int rightHeight = getHeight(node->right);
if(rightHeight == -1)return -1;//右
//计算当前节点左右子树的高度差
int res;
if(abs(leftHeight - rightHeight) > 1){//差值大于1,不满足条件
res = -1;
}else{//满足平衡条件,返回以当前节点为根节点的树的最大高度
res = 1 + max(leftHeight, rightHeight);
}
return res;
代码
class Solution {
public:
//确定递归函数参数和返回值
int getHeight(TreeNode* node){
//确定终止条件
if(node == NULL) return 0;
//明确单层处理逻辑
//递归计算当前节点的左子节点的高度
int leftHeight = getHeight(node->left);
//若发现不平衡,返回-1
if(leftHeight == -1)return -1;//左
//递归计算当前节点的左子节点的高度
int rightHeight = getHeight(node->right);
if(rightHeight == -1)return -1;//右
//计算当前节点左右子树的高度差
int res;
if(abs(leftHeight - rightHeight) > 1){//差值大于1,不满足条件
res = -1;
}else{//满足平衡条件,返回以当前节点为根节点的树的最大高度
res = 1 + max(leftHeight, rightHeight);
}
return res;
}
bool isBalanced(TreeNode* root) {
return getHeight(root) == -1 ? false: true;
}
};
【LeetCode二叉树#05】平衡二叉树的更多相关文章
- [LeetCode] 二叉树相关题目(不完全)
最近在做LeetCode上面有关二叉树的题目,这篇博客仅用来记录这些题目的代码. 二叉树的题目,一般都是利用递归来解决的,因此这一类题目对理解递归很有帮助. 1.Symmetric Tree(http ...
- LeetCode二叉树实现
LeetCode二叉树实现 # 定义二叉树 class TreeNode: def __init__(self, x): self.val = x self.left = None self.righ ...
- Leetcode:110. 平衡二叉树
Leetcode:110. 平衡二叉树 Leetcode:110. 平衡二叉树 点链接就能看到原题啦~ 关于AVL的判断函数写法,请跳转:平衡二叉树的判断 废话不说直接上代码吧~主要的解析的都在上面的 ...
- 二叉树、平衡二叉树、B-Tree、B+Tree 说明
背景 一般说MySQL的索引,都清楚其索引主要以B+树为主,此外还有Hash.RTree.FullText.本文简要说明一下MySQL的B+Tree索引,以及和其相关的二叉树.平衡二叉树.B-Tree ...
- LeetCode 二叉树,两个子节点的最近的公共父节点
LeetCode 二叉树,两个子节点的最近的公共父节点 二叉树 Lowest Common Ancestor of a Binary Tree 二叉树的最近公共父亲节点 https://leetcod ...
- 二叉树、平衡二叉树、红黑树、B树、B+树与B*树
转: 二叉树.平衡二叉树.红黑树.B树.B+树与B*树 一.二叉树 1️⃣二叉查找树的特点就是左子树的节点值比父亲节点小,而右子树的节点值比父亲节点大,如图: 基于二叉查找树的这种特点,在查找某个节点 ...
- leetcode二叉树题目总结
leetcode二叉树题目总结 题目链接:https://leetcode-cn.com/leetbook/detail/data-structure-binary-tree/ 前序遍历(NLR) p ...
- Leetcode——二叉树常考算法整理
二叉树常考算法整理 希望通过写下来自己学习历程的方式帮助自己加深对知识的理解,也帮助其他人更好地学习,少走弯路.也欢迎大家来给我的Github的Leetcode算法项目点star呀~~ 二叉树常考算法 ...
- 什么是泛型?,Set集合,TreeSet集合自然排序和比较器排序,数据结构-二叉树,数据结构-平衡二叉树
==知识点== 1.泛型 2.Set集合 3.TreeSet 4.数据结构-二叉树 5.数据结构-平衡二叉树 ==用到的单词== 1.element[ˈelɪmənt] 要素 元素(软) 2.key[ ...
- 56. 2种方法判断二叉树是不是平衡二叉树[is balanced tree]
[本文链接] http://www.cnblogs.com/hellogiser/p/is-balanced-tree.html [题目] 输入一棵二叉树的根结点,判断该树是不是平衡二叉树.如果某二叉 ...
随机推荐
- [转帖]kvm web管理 webvirtmgr
https://www.jianshu.com/p/8fd2ddadebe9 reference https://blog.csdn.net/yangshihuz/article/details/10 ...
- API架构风格对比:SOAP vs REST vs GraphQL vs RPC
API架构风格对比:SOAP vs REST vs GraphQL vs RPC 最近一段时间关于GraphQL的讨论很多,一些项目中也相继用到了这种风格,但使用是否合理,是否存在杀鸡用牛刀这样的问题 ...
- ios马甲包过审
说明:这篇文章写的比较早了,大概是2021年上半年写的,一直放在草稿箱,目前这些方法是否被屏蔽有待验证. App Store审核机制 机器审核 人工审核 人工审核大概是玩15分钟的样子,同时有上百审核 ...
- Paddle模型性能分析工具Profiler:定位瓶颈点、优化程序、提升性能
项目链接,fork一下即可使用 https://aistudio.baidu.com/aistudio/projectdetail/4482932?contributionType=1 Paddle模 ...
- 3.2 IDAPro脚本IDC常用函数
IDA Pro内置的IDC脚本语言是一种灵活的.C语言风格的脚本语言,旨在帮助逆向工程师更轻松地进行反汇编和静态分析.IDC脚本语言支持变量.表达式.循环.分支.函数等C语言中的常见语法结构,并且还提 ...
- Python 实现ARP扫描与欺骗
ARP欺骗又称ARP毒化或ARP攻击,是针对以太网地址解析协议ARP的一种攻击技术,通过欺骗局域网内访问者PC的网关MAC地址,使访问者PC错以为攻击者更改后的MAC地址是网关的MAC,导致网络不通. ...
- 《Mybatis 手撸专栏》第2章:创建简单的映射器代理工厂
作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 着急和快,是最大的障碍! 慢下来,慢下来,只有慢下来,你才能看到更全的信息,才能学到 ...
- Java-Stream-flatMap
Leave leave1 = new Leave("1","1",new Date(),CollUtil.newArrayList("A", ...
- 零基础入门Vue之梦开始的地方——插值语法
一.Vue 我!作为初学者,既然要将Vue,那我一定要介绍一下他是什么?我们可以应用一下官方的话 vue的介绍 Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架.与 ...
- Dijkstra实现单源最短路
Dijkstra算法求单源最短路 Dijkstra算法应用于求一个给定图的单个源点到其他各顶点的最短路.其中应用Dijkstra算法的图应满足如下条件 图中没有负权边 有向或者无向图都可以 图中若有自 ...