给定一个二叉树,判断它是否是高度平衡的二叉树。
    本题中,一棵高度平衡二叉树定义为:
    一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。
    示例 1:
    给定二叉树 [3,9,20,null,null,15,7]
    3
    / \
    9 20
    / \
    15 7
    返回 true 。

    示例 2:
    给定二叉树 [1,2,2,3,3,null,null,4,4]
    1
    / \
    2 2
    / \
    3 3
    / \
    4 4
    返回 false 。

    解答:
    解答一:自顶向下(暴力法)
    解题思路: 自顶向下的比较每个节点的左右子树的最大高度差,如果二叉树中每个节点的左右子树最大高度差小于等于 1 ,即每个子树都平衡时,此时二叉树才是平衡二叉树

    代码实现:

    1. var isBalanced = function (root) {
    2. if(!root) return true
    3. return Math.abs(depth(root.left) - depth(root.right)) <= 1
    4. && isBalanced(root.left)
    5. && isBalanced(root.right)
    6. }
    7. var depth = function (node) {
    8. if(!node) return -1
    9. return 1 + Math.max(depth(node.left), depth(node.right))
    10. }

    解答二:自底向上(优化)
    解题思路: 利用后续遍历二叉树(左右根),从底至顶返回子树最大高度,判定每个子树是不是平衡树 ,如果平衡,则使用它们的高度判断父节点是否平衡,并计算父节点的高度,如果不平衡,返回 -1 。

    遍历比较二叉树每个节点 的左右子树深度:

    比较左右子树的深度,若差值大于 1 则返回一个标记 -1 ,表示当前子树不平衡
    左右子树有一个不是平衡的,或左右子树差值大于 1 ,则二叉树不平衡
    若左右子树平衡,返回当前树的深度(左右子树的深度最大值 +1 )
    代码实现:

    1. var isBalanced = function (root) {
    2. return balanced(root) !== -1
    3. };
    4. var balanced = function (node) {
    5. if (!node) return 0
    6. const left = balanced(node.left)
    7. const right = balanced(node.right)
    8. if (left === -1 || right === -1 || Math.abs(left - right) > 1) {
    9. return -1
    10. }
    11. return Math.max(left, right) + 1
    12. }