题目介绍
给定一个二叉树,判断它是否是高度平衡的二叉树。
本题中,一棵高度平衡二叉树定义为:
一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。
示例1
输入: root = [3,9,20,null,null,15,7]
输出: true
示例2
输入: root = [1,2,2,3,3,null,null,4,4]
输出: false
示例3
输入: root = []
输出: true
提示:
- 树中的节点数在范围
[0, 5000]内 -10^4 <= Node.val <= 10^4
解题思路
此题判断是否是平衡二叉树是根据左右子树的高度差的绝对值来判断,因此在判断时需要先获取根节点的左右子树,而左右子树也需要进行同样的判断
当某一棵子树已经不是平衡二叉树时,就不需要再继续判断更上层的树了。因此,如果子树是平衡二叉树的话,我们返回该子树的高度,如果子树已经不是平衡二叉树,那么直接返回 -1,当父节点拿到子树的高度为 -1 时,就知道不需要判断左右子树的高度差了,直接向上一级递归返回 -1 即可
解题步骤
- 判断是否是空树,如果是则直接返回
true - 判断当前节点如果是空节点,则返回
0,代表当前高度为0 - 判断当前节点如果是叶子节点,则返回
1, 叶子节点已经是最底层了,不会有子树 - 获取左子树的高度
leftDep,获取右子树的高度rightDep - 如果左子树或者右子树返回
-1,说明左子树或者右子树已经不是平衡二叉树,直接向上层返回-1 - 判断左右子树高度差的绝对值是否大于
1, 如果是,说明当前这棵树不是平衡二叉树,向上层返回-1 - 如果当前是平衡二叉树,则在左右子树的较大高度的基础上,加上当前的层数
1,即是当前这棵树的最大高度,返回给上层
解题代码
var isBalanced = function(root) {
// 如果是空树,直接返回 true
if (!root) return true
return _getDep(root) !== -1
};
var _getDep = function(root) {
// 如果是空节点,说明当前高度为 0
if (!root) return 0
// 如果是叶子节点,说明当前高度为 1
if (!root.left && !root.right) return 1
// 获取左子树的高度
const leftDep = _getDep(root.left)
// 获取右子树的高度
const rightDep = _getDep(root.right)
// 如果左子树不是平衡二叉树,或者右子树不是平衡二叉树,或者左右子树的高度差的绝对值大于 1,说明当前不是平衡二叉树
if (leftDep === -1 || rightDep === -1 || Math.abs(leftDep - rightDep) > 1) return -1
// 如果是平衡二叉树,返回左右子树中较高的高度,再加上当前节点所在的层数
return Math.max(leftDep, rightDep) + 1
}