account_treeBFS / DFS

BFS / DFS题型:怎么识别、怎么讲、怎么练

BFS/DFS 的关键不在遍历语法,而在于判断你是在做穷举、结构识别,还是在找按层扩展的最短答案。

覆盖题量

80+

推荐起手

先判断题目需要按层搜、按深度搜,还是两者都能做。

高频误区

visited 标记太晚,导致队列或递归里有大量重复状态。

什么时候该想到这个模式

输入本质上是树、图、矩阵,或者隐式状态图。
题目要求访问连通块或所有可达状态。
最少步数偏向 BFS,完整搜索偏向 DFS。

下手前的检查清单

先判断题目需要按层搜、按深度搜,还是两者都能做。
visited 要在正确时机标记,避免重复。
DFS 递归前先写清终止条件。
BFS 要先定义一层到底代表什么。

真正适合面试表达的解题步骤

1

先识别图模型,并定义邻居如何生成。

2

无权最短路优先 BFS,结构搜索优先 DFS。

3

统一维护 visited,避免重复处理状态。

4

把答案依赖的附加信息一起带上,例如层数或路径和。

5

如果图不连通,要考虑多起点遍历。

常见变体

网格遍历

适合岛屿计数、染色和边界扩散问题。

树遍历

适合父子层级和路径信息重要的题目。

状态图搜索

适合每个节点都是状态的问题,例如单词接龙或转盘锁。

模板预览

Python公开预览
from collections import deque

def bfs(start):
    queue = deque([start])
    visited = {start}
    while queue:
        node = queue.popleft()
        for nxt in graph[node]:
            if nxt not in visited:
                visited.add(nxt)
                queue.append(nxt)

def dfs(node):
    visited.add(node)
    for nxt in graph[node]:
        if nxt not in visited:
            dfs(nxt)

更像真实刷题路径的推荐题单

这组题不是随机罗列,而是按“先建立识别感,再补关键变体,最后上强度”去排,适合真的拿来做一轮 pattern 复习。

高频坑点

warning

visited 标记太晚,导致队列或递归里有大量重复状态。

warning

递归 DFS 深度过深,直接爆栈。

warning

把路径相关状态和全局 visited 混在一起。

warning

图不连通时只搜了一个连通块。

练习顺序建议

1

先刷网格 DFS 和岛屿类问题。

2

再做树遍历和简单图复制。

3

然后补拓扑排序和环检测。

4

最后再做单词接龙这类高难状态图 BFS。

BFS / DFS题型总结 | LeetCode 高频面试模式 - Interview AiBox