DFS 深度优先搜索算法
时间: 2025-08-13 21:59:04 AIGC 浏览: 15
### 3.1 DFS 算法原理
深度优先搜索(Depth-First Search,DFS)是一种用于遍历或搜索图和树结构的算法,其核心思想是沿着图的边尽可能深入地访问每一个节点,直到无法继续深入为止,然后回溯到上一个未被完全访问的节点继续搜索[^1]。该算法适用于连通图或非连通图的遍历,常用于解决路径查找、连通性判断、拓扑排序等问题。
DFS 的实现通常依赖于递归或显式栈结构[^2]。递归实现时,系统调用栈自动保存访问路径;非递归实现则使用栈(Stack)数据结构手动模拟访问路径。算法的基本流程如下:
- 从起始节点出发,标记该节点为已访问。
- 依次访问该节点的所有未被访问的邻接节点,并对每个邻接节点递归执行相同的操作。
- 当当前节点没有未被访问的邻接节点时,回溯至上一节点,继续探索其他分支。
在图结构中,为避免重复访问节点,必须维护一个访问标记数组(visited array)来记录每个节点是否已被访问[^3]。
### 3.2 DFS 的实现方法
#### 3.2.1 递归实现
递归实现是 DFS 最直观的实现方式,适合用于树结构或无环图的遍历。以下是一个基于邻接表表示图的 Python 实现:
```python
def dfs_recursive(graph, node, visited):
# 标记当前节点为已访问
visited[node] = True
print(node, end=' ')
# 遍历所有邻接节点
for neighbor in graph[node]:
if not visited[neighbor]:
dfs_recursive(graph, neighbor, visited)
# 示例图的邻接表表示
graph = {
0: [1, 2],
1: [2],
2: [0, 3],
3: [3]
}
visited = [False] * len(graph)
dfs_recursive(graph, 2, visited)
```
该实现通过递归函数调用的方式,自动利用系统调用栈完成深度优先遍历[^2]。
#### 3.2.2 非递归实现
对于某些深度较大的图结构,递归方式可能引发栈溢出问题,因此可以采用显式栈结构实现非递归版本的 DFS:
```python
def dfs_iterative(graph, start):
visited = [False] * len(graph)
stack = [start]
while stack:
node = stack.pop()
if not visited[node]:
visited[node] = True
print(node, end=' ')
# 将邻接节点压入栈中(逆序以保证正确访问顺序)
for neighbor in reversed(graph[node]):
if not visited[neighbor]:
stack.append(neighbor)
# 使用示例
graph = {
0: [1, 2],
1: [2],
2: [0, 3],
3: [3]
}
dfs_iterative(graph, 2)
```
该实现使用栈模拟递归过程,通过控制邻接节点入栈顺序来确保深度优先特性[^4]。
### 3.3 DFS 的特点与应用场景
DFS 的空间复杂度较低,适合用于深度较小的树或图结构,尤其在解空间深处存在可行解的场景中表现优异[^3]。然而,DFS 不保证首次找到最短路径,因此在最短路径问题中通常不适用。
典型应用场景包括:
- 图的连通性检测
- 拓扑排序
- 回溯算法(如八皇后问题、迷宫求解)
- 穷举解空间路径
---
阅读全文
相关推荐
















