问题概述
给定一个二叉树的根节点 root,返回它的最大深度。
二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。
可视化说明
示例 1:最大深度 = 3
3
/ \
9 20
/ \
15 7
从根到叶子的最长路径是:3 → 20 → 15(或 3 → 20 → 7)
深度 = 3 个节点
示例 2:最大深度 = 2
1
\
2
从根到叶子的最长路径是:1 → 2
深度 = 2 个节点
深度计算
- 深度 = 从根节点到目标节点的节点数(包含根节点和目标节点)
- 根节点的深度为 1
- 空树的深度为 0
- 最大深度 = 从根到任意叶子的最长路径
解法 1:递归(推荐)
工作原理
递归计算左右子树的深度,然后返回 1 + 两者的最大值:
python
class Solution:
def maxDepth(self, root):
if not root:
return 0
left_depth = self.maxDepth(root.left)
right_depth = self.maxDepth(root.right)
return 1 + max(left_depth, right_depth)
复杂度分析
- 时间复杂度: O(n) - 每个节点恰好访问一次
- 空间复杂度: O(h) - 递归栈深度等于树的高度(最坏情况 O(n) 对于倾斜树)
何时使用
- 推荐 - 最直观和简洁的解决方案
- 自然的递归结构匹配树结构
- 易于理解和实现
关键洞察
树的最大深度是:
- 如果树为空,则为 0
- 否则为 1 + max(左子树深度, 右子树深度)
解法 2:迭代(使用 BFS)
工作原理
使用 BFS(层序遍历)来计数层数:
python
from collections import deque
class Solution:
def maxDepth(self, root):
if not root:
return 0
queue = deque([root])
depth = 0
while queue:
depth += 1
level_size = len(queue)
for _ in range(level_size):
node = queue.popleft()
if node.left:
queue.append(node.left)
if node.right:
queue.append(node.right)
return depth
复杂度分析
- 时间复杂度: O(n) - 每个节点恰好访问一次
- 空间复杂度: O(n) - 队列在最坏情况下可以容纳 n/2 个节点(完全树)
何时使用
- 递归的替代方案
- 避免非常深的树的潜在栈溢出
- 需要逐层处理时有用
对比
| 方法 | 时间 | 空间 | 最佳适用 |
|---|---|---|---|
| 递归 | O(n) | O(h) | 大多数情况,直观 |
| 迭代(BFS) | O(n) | O(n) | 深度树,避免递归 |
总结
两种方法都实现了 O(n) 时间复杂度。递归解决方案通常因其简单性而更受欢迎。关键洞察是最大深度等于 1 加上左右子树的最大深度。