theme: hydrogen
持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第 3 天,点击查看活动详情
题目链接
题目描述
给定一个二叉树,判断它是否是高度平衡的二叉树。
本题中,一棵高度平衡二叉树定义为:
一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。
测试用例
示例 1:
输入: root = [3,9,20,null,null,15,7]
输出: true
限制
- 树中的节点数在范围
[0, 5000]内 -104 <= Node.val <= 104
题目分析
首先,对树的高度的定义,为:根节点,到最远的叶子节点的距离;子树的高度定义也类似,即为子树根节点到他的最远的叶子节点的距离
题目需要我们判断给定的树,是否为高度平衡的二叉树,即需要以递归的方式,去遍历每一个节点,并同时记录下这个节点的左右子节点的子树高度,然后判断左右子树的高度差的绝对值,是否为 1
因为我们需要知道当前节点的左右子节点的信息,即需要在左右子节点遍历完成后,做一些逻辑判断;即我们需要以后续遍历的方式来处理这一颗树
后序遍历的逻辑为:
- 如果当前节点为
null,直接返回 0 - 对左右子节点返回的高度值,做
+1处理 - 拿到左右子节点的高度值,后,判断他们的绝对差值
- 差值小于、等于
1则选择其中最大的一个值作为这个节点的高度值 - 差值大于
1则将标记修改并返回
- 差值小于、等于
- 当遍历的时候,发现已有子节点确认不是平衡二叉树时,直接返回
代码实现
完整的代码实现如下,与常规的递归相比,多了一个返回值
var isBalanced = function(root) {
let flag = true;
trave(root);
return flag;
function trave(node) {
if (flag == false) return;
if (node == null) return 0;
let lt = trave(node.left) + 1;
let rt = trave(node.right) + 1;
if (Math.abs(lt - rt) > 1) {
flag = false;
} else {
return Math.max(lt, rt);
}
}
};