平衡二叉树

定义:在 AVL 树中,任意节点对应的两棵子树的最大高度差为 1。

暴力

自顶向下会对子树的高度重复计算。

function isBalanced(root: TreeNode | null): boolean {
  if (root === null) return true
  if (!root.left && !root.right) return true

  function height(root: TreeNode | null): number {
    if (!root) return 0

    return Math.max(height(root.left), height(root.right)) + 1
  }

  return Math.abs(height(root.left) - height(root.right)) <= 1 && isBalanced(root.left) && isBalanced(root.right)
}

自底向上

如果存在一棵子树不平衡,那么整个二叉树一定是不平衡的。

function isBalanced(root: TreeNode | null): boolean {
  function height(root: TreeNode | null): number {
    if (root === null) return 0
    let leftHeight = height(root.left)
    let rightHeight = height(root.right)
    if (leftHeight === -1 || rightHeight === -1 || Math.abs(leftHeight - rightHeight) > 1) {
      return -1
    } else {
      return Math.max(height(root.left), height(root.right)) + 1
    }
  }

  return height(root) >= 0
}