「这是我参与2022首次更文挑战的第24天,活动详情查看:2022首次更文挑战」
题目
给定一个二叉树,判断它是否是高度平衡的二叉树。
本题中,一棵高度平衡二叉树定义为:
一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 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] 内
-104 <= Node.val <= 104
来源:力扣(LeetCode)leetcode-cn.com/problems/ba…
解题思路
- 设计递归函数,获取树的高度,树高等于左子树和右子树中高度大的一个加 1,即
Math.max(l, r) + 1; - 给这个函数一个另外的意义,当左子树和右子树的绝对值大于 1 时,代表不是平衡二叉树,并且返回 -1;
- 当左子树或右子树不平衡时,当前树也不是平衡二叉树;
调用递归函数获取树高,如果树高大于等于 0,则是平衡二叉树。
代码实现
var isBalanced = function(root) {
//如果树高小于 0,则不是平衡二叉树
return getHeight(root) >= 0
};
//获取一棵树的高度
var getHeight = function(root) {
//如果根节点为空则树的高度为0
if (!root) return 0
//获取树的左子树的高度
const l = getHeight(root.left)
//获取树的右子树的高度
const r = getHeight(root.right)
//如果左子树或者右子树的不是平衡二叉树,则当前节点也不是平衡二叉树
if (l < 0 || r < 0) return -1
//如果左子树和右子树的绝对值大于1,则说明不平衡了,返回 -1
if (Math.abs(l - r) > 1) return -1
//左子树和右子树中高度大的一个加 1,则是当前树的高度
return Math.max(l, r) + 1
}
如有错误欢迎指出,欢迎一起讨论!