
前言
深度优先搜索 (Depth-First Search, DFS) 是算法世界中重要的搜索策略。它像探险家在迷宫中探索,总是沿着一条路径走到尽头,才会返回尝试其他路径。本文将深入讲解 DFS 的原理、实现和应用。
知识点说明
1. DFS 的基本概念
深度优先搜索 (DFS) 是一种用于遍历或搜索树或图的算法。它的核心思想是:从起始节点开始,尽可能深入地探索一条路径,直到无法继续为止,然后回溯到前一个节点,继续探索其他未访问的路径。
DFS 的三个关键特点:
- 优先深度:算法会尽可能深入地探索一条路径,而不是广泛地探索所有可能的路径
- 使用栈:DFS 通常使用栈(或递归,隐式使用系统栈)来记住探索过程中的节点
- 回溯:当无法继续深入时,算法会回溯到前一个节点,尝试其他未探索的路径
2. DFS 的基本步骤
实现 DFS 的基本步骤如下:
- 选择一个起始节点,将其标记为已访问,并放入栈中
- 当栈不为空时,执行以下操作:
- 取出栈顶节点作为当前节点
- 如果当前节点有未访问的相邻节点,选择一个,标记为已访问,并将其放入栈中
- 如果当前节点没有未访问的相邻节点,将其从栈中弹出(回溯)
重复步骤 2,直到栈为空

3. DFS 的两种实现方式
DFS 有两种常见的实现方式:
递归实现
递归实现利用系统栈隐式地管理节点的访问顺序,代码简洁易懂:
public void dfsRecursive(Graph graph, int vertex, boolean[] visited) {
// 标记当前节点为已访问
visited[vertex] = true;
System.out.print(vertex + " ");
// 递归访问所有未访问的邻接节点
for (int neighbor : graph.getNeighbors(vertex)) {
if (!visited[neighbor]) {
dfsRecursive(graph, neighbor, visited);
}
}
}
迭代实现
迭代实现使用显式的栈来管理节点的访问顺序:


