返回
深入浅出:解读 LeetCode 55 - II 平衡二叉树背后的奥秘
后端
2023-12-31 01:42:34
导言
平衡二叉树是一种高度平衡的二叉树,其中任意节点的左右子树高度差绝对值不超过 1。在 LeetCode 55 - II 中,我们面临着判断一棵二叉树是否为平衡二叉树的挑战。本文将带你深入浅出地理解平衡二叉树的奥秘,并逐步剖析 LeetCode 55 - II 问题的解法。
解题思路
解题的关键在于递归地遍历二叉树,同时计算每个节点的左右子树深度。我们可以定义一个辅助函数 checkBalanced
,它接收一个节点指针作为参数,并返回一个元组,包含两个值:
- 一个布尔值,指示该节点是否属于平衡二叉树。
- 该节点及其所有子节点的最大深度。
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
代码详解
- 递归基线: 如果当前节点为空,则返回
True
和0
,表示空树是平衡的,深度为 0。 - 递归左右子树: 分别递归地检查左右子树的平衡性和深度。
- 判断平衡性: 如果左右子树都平衡,并且它们的深度差绝对值不超过 1,则当前节点是平衡的。
- 更新深度: 当前节点的最大深度为其左右子树中最大深度的加 1。
- 返回结果: 返回当前节点的平衡性状态和最大深度。
时间复杂度
该算法的时间复杂度为 O(n),其中 n 为二叉树中的节点数。这是因为该算法需要遍历二叉树中的每个节点一次。
空间复杂度
该算法的空间复杂度为 O(h),其中 h 为二叉树的高度。这是因为该算法使用了递归调用堆栈,其深度取决于二叉树的高度。
示例
考虑以下二叉树:
1
/ \
2 3
/ \ \
4 5 6
应用 checkBalanced
函数,我们可以获得以下结果:
checkBalanced(root) == (True, 3)
这意味着该二叉树是平衡的,其最大深度为 3。
结论
理解平衡二叉树的奥秘对于解决 LeetCode 55 - II 问题至关重要。通过采用递归和深度计算的巧妙结合,我们可以高效地判断一棵二叉树是否平衡。本文提供了详细的解释和清晰的示例,让你轻松掌握这一算法的精髓,为解决更复杂的数据结构问题奠定基础。