二叉树的最大深度问题
字数 762 2025-11-13 00:39:14
二叉树的最大深度问题
题目描述
给定一个二叉树的根节点 root,返回其最大深度(即从根节点到最远叶子节点的最长路径上的节点数)。
解题思路
二叉树的最大深度可以通过递归或迭代两种方式求解。递归方法更简洁,迭代方法(如层序遍历)更直观。下面我们详细讲解这两种方法。
方法一:递归(深度优先搜索,DFS)
核心思想
二叉树的最大深度可以分解为:
- 根节点的深度为 1。
- 左子树的最大深度。
- 右子树的最大深度。
最终,根节点的最大深度 = 1 + max(左子树最大深度, 右子树最大深度)。
步骤分解
- 基准情况:如果根节点为空(即树为空),返回深度 0。
- 递归计算左子树深度:对左子节点调用同一函数。
- 递归计算右子树深度:对右子节点调用同一函数。
- 合并结果:返回 1 + max(左子树深度, 右子树深度)。
示例代码(Python)
def maxDepth(root):
if not root: # 基准情况
return 0
left_depth = maxDepth(root.left) # 递归左子树
right_depth = maxDepth(root.right) # 递归右子树
return 1 + max(left_depth, right_depth)
复杂度分析
- 时间复杂度:O(n),每个节点访问一次。
- 空间复杂度:O(h),其中 h 为树的高度,递归栈的深度。
方法二:迭代(广度优先搜索,BFS)
核心思想
使用层序遍历(BFS),每遍历一层,深度加 1,直到所有节点遍历完毕。
步骤分解
- 如果根节点为空,直接返回 0。
- 初始化队列(包含根节点)和深度计数器
depth = 0。 - 当队列不为空时:
- 当前层的节点数 = 队列长度。
- 依次弹出当前层的所有节点,并将它们的子节点加入队列。
- 深度计数器加 1。
- 返回深度计数器。
示例代码(Python)
from collections import deque
def maxDepth(root):
if not root:
return 0
queue = deque([root])
depth = 0
while queue:
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)
depth += 1 # 完成一层遍历
return depth
复杂度分析
- 时间复杂度:O(n),每个节点访问一次。
- 空间复杂度:O(w),其中 w 为树的最大宽度(队列长度)。
总结
- 递归方法代码简洁,适合理解分治思想。
- 迭代方法避免了递归栈溢出的风险,适合深度较大的树。
- 两种方法均需掌握,面试中可根据面试官要求灵活选择。