
广度优先搜索 (BFS) ------ 层序遍历法
这是最直觉的方法。一层一层地遍历树,只记录每一层的最后一个节点。
工具:队列(Queue)。
步骤:
- 把根节点放进队列。
- 当队列不为空时,计算当前层的节点数 n。
- 循环 n 次,把这一层的所有节点都弹出来。
- 关键点:当你处理到这一层的第 n 个(即最后一个)节点时,把它存入结果列表
时间复杂度O(N)
我们必须访问树中的每一个节点(每个节点进出队列各一次),N 为节点总数。
空间复杂度O(W)
W 是树的最大宽度(即节点最多的一层)。在满二叉树中,最后一层大约有 N/2 个节点,所以空间复杂度最坏也是 O(N)。
python
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
from collections import deque
class Solution:
def rightSideView(self, root: Optional[TreeNode]) -> List[int]:
if not root:
return []
q = deque([root]) # 从顶层开始, deque放当前处理层的元素
res = []
while q:
# 1. 记录当前这一层有多少个节点
level_size = len(q)
# 2. 连续弹出 level_size 次,确保只处理当前层
for i in range(level_size):
node = q.popleft() # 弹出当前节点
if i == level_size - 1: # 如果是最后一个节点
res.append(node.val)
# 加入当前节点的左右节点
if node.left:
q.append(node.left)
if node.right:
q.append(node.right)
return res
递归 深度优先
递归的同时记录深度,根-右-左
时间复杂度O(N)
同样需要走遍每个节点。虽然我们只取每层第一个看到的,但为了确认没有更深的节点,程序必须遍历完整棵树。
空间复杂度O(H)
H 是树的最大高度。这是由递归产生的系统栈深度决定的。
特点:
如果树是平衡的,H=logNH = \log NH=logN,此时 DFS 比 BFS 节省很多内存。
如果树退化成一根直线(链表),H=NH = NH=N,此时两者空间开销差不多。