难度:简单
题目描述:
输入一棵二叉树的根节点,判断该树是不是平衡二叉树。如果某二叉树中任意节点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。
示例:
自顶向下
- 核心思想前序遍历(先当前,后子结点)
- 递归法-有大量重复
- 自顶向下,求左右高度,计算差值
var isBalanced = function (root) {
if (!root) {
return true;
}
/** 递归法-有大量重复
* 1. 自顶向下,求左右高度,计算差值
*/
let leftHeight = getNodeHeight(root.left);
let rightHeight = getNodeHeight(root.right);
if (Math.abs(leftHeight - rightHeight) > 1) {
return false;
}
return isBalanced(root.left) && isBalanced(root.right);
};
function getNodeHeight(node) {
if (!node) {
//没有了返回0,不表示不稳定
return 0
}
return Math.max(getNodeHeight(node.left), getNodeHeight(node.right)) + 1;
}
自底向上
核心思想后序遍历(先子结点,后当前)
从叶子节点向上,-1表示不平衡,>0表示高度
比较左右节点高度,是否满足avl(有一边是-1,则直接返回-1),不满足-1,否则返回节点的高度
最后看高度是-1还是其它的
var isBalanced = function (root) {
if (!root) {
return true;
}
/** 思路
* 1. 从叶子节点向下,-1表示不平衡,>0表示高度
* 2. 比较左右节点高度,是否满足avl,不满足-1,否则返回节点的高度
* 3. 最后看高度是-1还是其它的
*/
return balancedHelper(root) > -1;
};
function balancedHelper(node) {
if (!node) {
//没有了返回0,不表示不稳定
return 0
}
let leftHeight = balancedHelper(node.left);
let rightHeight = balancedHelper(node.right);
//如果有一边是-1,则表明不平衡
if (leftHeight == -1 || rightHeight == -1) {
return -1;
}
//如果差值大于1,返回-1
if (Math.abs(leftHeight - rightHeight) > 1) {
return -1;
}
//如果都不是-1,将左、右最大height+当前返回
return Math.max(leftHeight, rightHeight) + 1;
}