难度:简单
题目描述:
输入一棵二叉树的根节点,判断该树是不是平衡二叉树。如果某二叉树中任意节点的左右子树的深度相差不超过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,返回-1if (Math.abs(leftHeight - rightHeight) > 1) {return -1;}//如果都不是-1,将左、右最大height+当前返回return Math.max(leftHeight, rightHeight) + 1;}
