在算法世界中,深度优先搜索(Depth-First Search,简称 DFS)是一种基础且核心的遍历与搜索算法。它以'纵向挖掘'为核心思想,沿着一条路径探索至终点后,回溯至前一节点继续探索其他路径,如同迷宫中沿着一条通道走到头,再折返寻找新通道。这种特性让 DFS 在图论遍历、迷宫求解、组合问题、拓扑排序等场景中广泛应用,也是面试与算法竞赛的高频考点。
一、DFS 核心原理:纵向探索与回溯
1. 核心思想
DFS 的本质是'不撞南墙不回头':从起始节点出发,优先探索当前节点的某一条邻接路径,直至无法继续前进(到达终点或已访问节点),再回溯到上一个未探索完所有邻接节点的节点,重复此过程,直至遍历所有可达节点。
2. 关键概念
- 访问标记:为避免重复访问节点(陷入死循环),需用数组或哈希表记录节点是否已被访问。
- 回溯:探索完一条路径后,撤销当前节点的访问标记(若需多次遍历),回到上一节点继续探索其他路径,是 DFS 区别于其他遍历算法的核心。
- 递归与栈:DFS 可通过递归实现(利用函数调用栈隐式维护遍历路径),也可通过显式栈手动实现,两种方式本质一致。
3. 遍历流程示意图
以无向图 1-2-3-4,1-5 为例,DFS 遍历流程(起始节点为 1):
- 访问节点 1,标记为已访问;
- 选择邻接节点 2,访问并标记;
- 选择节点 2 的邻接节点 3,访问并标记;
- 选择节点 3 的邻接节点 4,访问并标记;
- 节点 4 无未访问邻接节点,回溯至 3;
- 节点 3 无其他未访问邻接节点,回溯至 2;
- 节点 2 无其他未访问邻接节点,回溯至 1;
- 选择节点 1 的邻接节点 5,访问并标记;
- 节点 5 无未访问邻接节点,回溯至 1;
- 所有节点遍历完成,流程结束。最终遍历顺序:1→2→3→4→5(路径不唯一,取决于邻接节点的遍历顺序)。
二、DFS 基础框架(伪代码)
1. 递归实现(简洁直观)
递归是 DFS 最常用的实现方式,利用函数调用栈自动维护回溯路径,代码简洁易懂,适合大部分场景。
伪代码框架
bool visited[];
void dfs(当前节点 u) {
visited[u] = true;
处理当前节点 u;
遍历 u 的所有邻接节点 v:
若 v 未访问,则递归调用 dfs(v);
可选:visited[u] = false;
}
2. 栈实现(显式维护路径)
当递归深度过大时(如节点数超过 1e4),会导致栈溢出,此时需用显式栈手动实现 DFS,避免递归栈溢出问题。
伪代码框架
void dfs(起始节点 u) {
初始化栈,将 u 入栈,并标记为已访问;
while 栈不为空:
弹出栈顶节点 curr;
处理 curr 节点;
遍历 curr 的所有邻接节点 v:
若 v 未访问,则标记为已访问,入栈;
}



