一、概念:
深度优先搜索 (DFS, Depth-First Search) 是一种用于遍历或搜索树与图的经典算法。其核心思想是:从起点出发,沿着一条路径尽可能深入探索,直到无法继续(到达尽头或已访问节点),然后回溯 ** 到上一个节点,尝试另一条未走过的分支,直至遍历所有节点。
二、核心原理与流程
DFS 本质是回溯法,依赖 栈 (Stack) 结构(递归隐式调用系统栈,迭代手动维护栈),遵循 后进先出 (LIFO) 原则。
标准步骤(图遍历):
标记起点:选择起始节点,标记为已访问。
深入探索:访问当前节点,然后递归 / 迭代访问其任意一个未访问的邻接节点。
回溯:当当前节点所有邻接节点均已访问,则回溯到上一级节点。
结束:重复步骤 2-3,直到栈空或所有节点遍历完成。
举例说明如下:
A
/
B C
/ \ /
D E F
以上是一个树形结构,深度优先搜索访问顺序:A → B → D →E →C → F
可以将深度优先搜索比作走进一个迷宫:
进门,标记 "我来过这里"
看到一个路口,随便选一条往前走
继续走,继续走...... 直到死胡同
退回到上一个有别的路的路口
走另一条没走过的路
重复直到走完所有路
三、C语言实现
c
#include <stdio.h>
// 最多 5 个节点
#define N 5
// 邻接矩阵:graph[u][v] = 1 表示 u 和 v 相连
int graph[N][N] = {
// 0 1 2 3 4
{0, 1, 1, 0, 0}, // 0
{1, 0, 0, 1, 1}, // 1
{1, 0, 0, 0, 0}, // 2
{0, 1, 0, 0, 0}, // 3
{0, 1, 0, 0, 0} // 4
};
// 访问标记:0=未访问,1=已访问
int visited[N];
// DFS 函数:从节点 u 开始深度优先搜索
void dfs(int u) {
// ======================
// 第一步:标记当前节点已访问
// ======================
visited[u] = 1;
printf("访问节点:%d\n", u);
// ======================
// 第二步:遍历所有邻居
// ======================
for (int v = 0; v < N; v++) {
// 判断两个条件:
// 1. graph[u][v] == 1:u 和 v 之间有边
// 2. visited[v] == 0:v 还没去过
if (graph[u][v] == 1 && visited[v] == 0) {
// ======================
// 第三步:递归深入下一个节点
// ======================
dfs(v);
// 这里递归回来,就是"回溯"
}
}
// 所有子节点都走完了,函数返回,自动回溯
}
int main() {
printf("从节点 0 开始 DFS:\n\n");
// 初始化标记数组为 0(都没访问)
for (int i = 0; i < N; i++)
visited[i] = 0;
// 开始搜索
dfs(0);
return 0;
}