返回

深入浅出:解读 LeetCode 55 - II 平衡二叉树背后的奥秘

后端

导言

平衡二叉树是一种高度平衡的二叉树,其中任意节点的左右子树高度差绝对值不超过 1。在 LeetCode 55 - II 中,我们面临着判断一棵二叉树是否为平衡二叉树的挑战。本文将带你深入浅出地理解平衡二叉树的奥秘,并逐步剖析 LeetCode 55 - II 问题的解法。

解题思路

解题的关键在于递归地遍历二叉树,同时计算每个节点的左右子树深度。我们可以定义一个辅助函数 checkBalanced,它接收一个节点指针作为参数,并返回一个元组,包含两个值:

  1. 一个布尔值,指示该节点是否属于平衡二叉树。
  2. 该节点及其所有子节点的最大深度。

checkBalanced 函数的实现如下:

def checkBalanced(root):
    if not root:
        return True, 0  # 空树是平衡的,深度为 0

    left_balanced, left_depth = checkBalanced(root.left)
    right_balanced, right_depth = checkBalanced(root.right)

    # 判断左右子树是否平衡
    balanced = left_balanced and right_balanced and abs(left_depth - right_depth) <= 1

    # 更新当前节点的最大深度
    max_depth = max(left_depth, right_depth) + 1

    return balanced, max_depth

代码详解

  1. 递归基线: 如果当前节点为空,则返回 True0,表示空树是平衡的,深度为 0。
  2. 递归左右子树: 分别递归地检查左右子树的平衡性和深度。
  3. 判断平衡性: 如果左右子树都平衡,并且它们的深度差绝对值不超过 1,则当前节点是平衡的。
  4. 更新深度: 当前节点的最大深度为其左右子树中最大深度的加 1。
  5. 返回结果: 返回当前节点的平衡性状态和最大深度。

时间复杂度

该算法的时间复杂度为 O(n),其中 n 为二叉树中的节点数。这是因为该算法需要遍历二叉树中的每个节点一次。

空间复杂度

该算法的空间复杂度为 O(h),其中 h 为二叉树的高度。这是因为该算法使用了递归调用堆栈,其深度取决于二叉树的高度。

示例

考虑以下二叉树:

        1
       / \
      2   3
     / \   \
    4   5   6

应用 checkBalanced 函数,我们可以获得以下结果:

checkBalanced(root) == (True, 3)

这意味着该二叉树是平衡的,其最大深度为 3。

结论

理解平衡二叉树的奥秘对于解决 LeetCode 55 - II 问题至关重要。通过采用递归和深度计算的巧妙结合,我们可以高效地判断一棵二叉树是否平衡。本文提供了详细的解释和清晰的示例,让你轻松掌握这一算法的精髓,为解决更复杂的数据结构问题奠定基础。