力扣题目链接(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】平衡二叉树的更多相关文章

  1. [LeetCode] 二叉树相关题目(不完全)

    最近在做LeetCode上面有关二叉树的题目,这篇博客仅用来记录这些题目的代码. 二叉树的题目,一般都是利用递归来解决的,因此这一类题目对理解递归很有帮助. 1.Symmetric Tree(http ...

  2. LeetCode二叉树实现

    LeetCode二叉树实现 # 定义二叉树 class TreeNode: def __init__(self, x): self.val = x self.left = None self.righ ...

  3. Leetcode:110. 平衡二叉树

    Leetcode:110. 平衡二叉树 Leetcode:110. 平衡二叉树 点链接就能看到原题啦~ 关于AVL的判断函数写法,请跳转:平衡二叉树的判断 废话不说直接上代码吧~主要的解析的都在上面的 ...

  4. 二叉树、平衡二叉树、B-Tree、B+Tree 说明

    背景 一般说MySQL的索引,都清楚其索引主要以B+树为主,此外还有Hash.RTree.FullText.本文简要说明一下MySQL的B+Tree索引,以及和其相关的二叉树.平衡二叉树.B-Tree ...

  5. LeetCode 二叉树,两个子节点的最近的公共父节点

    LeetCode 二叉树,两个子节点的最近的公共父节点 二叉树 Lowest Common Ancestor of a Binary Tree 二叉树的最近公共父亲节点 https://leetcod ...

  6. 二叉树、平衡二叉树、红黑树、B树、B+树与B*树

    转: 二叉树.平衡二叉树.红黑树.B树.B+树与B*树 一.二叉树 1️⃣二叉查找树的特点就是左子树的节点值比父亲节点小,而右子树的节点值比父亲节点大,如图: 基于二叉查找树的这种特点,在查找某个节点 ...

  7. leetcode二叉树题目总结

    leetcode二叉树题目总结 题目链接:https://leetcode-cn.com/leetbook/detail/data-structure-binary-tree/ 前序遍历(NLR) p ...

  8. Leetcode——二叉树常考算法整理

    二叉树常考算法整理 希望通过写下来自己学习历程的方式帮助自己加深对知识的理解,也帮助其他人更好地学习,少走弯路.也欢迎大家来给我的Github的Leetcode算法项目点star呀~~ 二叉树常考算法 ...

  9. 什么是泛型?,Set集合,TreeSet集合自然排序和比较器排序,数据结构-二叉树,数据结构-平衡二叉树

    ==知识点== 1.泛型 2.Set集合 3.TreeSet 4.数据结构-二叉树 5.数据结构-平衡二叉树 ==用到的单词== 1.element[ˈelɪmənt] 要素 元素(软) 2.key[ ...

  10. 56. 2种方法判断二叉树是不是平衡二叉树[is balanced tree]

    [本文链接] http://www.cnblogs.com/hellogiser/p/is-balanced-tree.html [题目] 输入一棵二叉树的根结点,判断该树是不是平衡二叉树.如果某二叉 ...

随机推荐

  1. 不同信创服务器Redis7.0.5性能表现总结

    不同信创服务器Redis7.0.5性能表现总结 背景以及基础约定 随着美帝2022.10收紧EAR规定的硬件出口规定 信创事业迎来了一波新的高潮. 最近不仅仅要求国产化的硬件. 更要求国产化的OS,以 ...

  2. Linux下PG数据库计划任务定期备份恢复的方法

    注意事项 PG数据库需要注意的一点是需要安装OSSP-UUID的组件才能使用. 本次使用最除了冷备之外 最简单的 pg_dump和pg_restore的操作 的方式来进行处理 务必定期演练保证数据备份 ...

  3. 从DevOps状态报告看技术团队的文化建设

    本文源自一次内部分享,借由此机会又把历年的DevOps状态报告翻看了一遍,其实大多数时候我们对于DevOps的理解都在于流程,工具,实践这些看得见摸得着的东西,但就像文末的几点思考所说的那样,我们一直 ...

  4. Dubbo架构设计与源码解析(一) 架构设计

    作者:黄金 一.架构演变 单应用架构 ----> 垂直架构 ----> 分布式架构 ----> 微服务架构 ----> 云原生架构 二.Dubbo总体架构 1.角色职能 • C ...

  5. 手把手带你开发starter,点对点带你讲解原理

    京东物流 孔祥东 _____ _ ____ _ / ____| (_) | _ \ | | | (___ _ __ _ __ _ _ __ __ _| |_) | ___ ___ | |_ \___ ...

  6. Windows10磁盘占用100%和内存占用高

    前言 公司配备了两台电脑,两台电脑都是安装的win10系统,一台是磁盘占用高,另一台是内存可用低. 具体情况如下: 一台外网机 8g内存,安装win10 专业版,开机一天后经常出现内存不够用,但其实都 ...

  7. 从零开始配置 vim(11)——插件管理

    之前我们介绍了基础配置部分和快捷键配置部分.如果你配置了这两个部分,vim已经算是比较好用了.但是作为代码编辑器来讲还是显的比较简陋,用这些配置来完成日常的编码任务会显得力不从心.vim比较强大的一点 ...

  8. 微信小程序-组件生命周期方法

    官方文档:https://developers.weixin.qq.com/miniprogram/dev/reference/api/Component.html 正如官方显示组件的生命周期中常用的 ...

  9. SqlSugar Code First

      注意点 1.SqlSugar Code First可以快速开发,使用起来也要分阶段使用,比如早期随便搞,中后期需要禁用一些功能保证数据安全(标题6和7 ) 2.数据库账号需要有比较高的权限, 3. ...

  10. 基于中文金融知识的 LLaMA 系微调模型的智能问答系统:LLaMA大模型训练微调推理等详细教学

    基于中文金融知识的 LLaMA 系微调模型的智能问答系统:LLaMA大模型训练微调推理等详细教学 基于 LLaMA 系基模型经过中文金融知识指令精调/指令微调(Instruct-tuning) 的微调 ...