深度优先遍历DFS:从入门到精通

一、先解答上次的思考题

无向图:顶点 0-1-2-3,边:0-1、0-2、1-2、2-3

  • 邻接矩阵:对应位置置 1
  • 邻接表:每个顶点链表列出邻居

二、今天学习目标

  1. 理解 DFS 深度优先遍历
  2. 记住核心思想:一条路走到黑,走不通再回头
  3. 邻接矩阵 + 递归实现 DFS
  4. 完整可运行代码

三、什么是 DFS?

DFS:Depth First Search深度优先,先走到底,再回溯

可以理解为:

  • 走迷宫:一直往前,遇到岔路选一条,走不通就退回来换一条
  • 树的前序遍历,就是 DFS 的一种

关键点:

  • 需要 visited 数组 标记是否走过
  • 一般用 递归 最简单

四、DFS 基本步骤

  1. 访问当前节点,标记 visited[u] = 1
  2. 遍历所有邻居 v
  3. 如果 v 没被访问,递归 DFS (v)

五、完整代码:邻接矩阵 + DFS

cpp 复制代码
#include <stdio.h>
#define N 5

// 邻接矩阵
int graph[N][N] = {0};
// 访问标记
int visited[N] = {0};

// 添加无向边
void addEdge(int u, int v) {
    graph[u][v] = 1;
    graph[v][u] = 1;
}

// DFS 核心
void dfs(int u) {
    // 访问当前节点
    printf("%d ", u);
    visited[u] = 1;

    // 遍历所有可能邻居
    for (int v = 0; v < N; v++) {
        // 有边且未访问
        if (graph[u][v] == 1 && !visited[v]) {
            dfs(v);
        }
    }
}

int main() {
    // 构建图
    addEdge(0, 1);
    addEdge(0, 2);
    addEdge(1, 3);
    addEdge(1, 4);
    addEdge(3, 4);

    printf("DFS 遍历顺序:");
    dfs(0);

    return 0;
}

六、运行结果示例

cpp 复制代码
DFS 遍历顺序:0 1 3 4 2

(具体顺序可能因邻接矩阵遍历顺序略有不同,均属正确)


七、DFS 适用场景

  • 连通性判断
  • 迷宫求解
  • 寻找路径
  • 拓扑排序
  • 求连通块数量

八、今日小练习

图:顶点:0 1 2 3边:0-1,0-2,1-2,2-3

从 0 开始 DFS,写出遍历顺序。

相关推荐
白狐_7982 分钟前
408 数据结构|完全二叉树两道典型题:第 6 层叶结点数与叶结点总数
数据结构·算法
lucas_AI3 分钟前
喂张白纸也能吐出证件号?文档 MLLM 的"关系级泄露"被测出来了
人工智能·算法·掘金技术征文
手写码匠17 分钟前
华为云Flexus+DeepSeek征文|Dify 多 Agent 灰度发布实战:让每一次变更都“小步快跑、随时可回滚“
人工智能·深度学习·算法·aigc
Nil2081 小时前
leetcode 48旋转图像
算法·leetcode·职场和发展
嘟嘟07171 小时前
顺时针螺旋填充 n×n 矩阵:手撕 generateMatrix 的四个 for 循环
javascript·算法·面试
Nil2081 小时前
leetcode 206反转链表
算法·leetcode·链表
Kstheme1 小时前
大模型内部是怎么运作的?从「一个神经元」拆到「残差流」
算法
郝学胜_神的一滴1 小时前
并查集深度入门:从玄学抽象到 QuickFind & QuickUnion 源码实战
数据结构·算法
GeekZHR2 小时前
C语言指针2:数组名、二级指针、指针数组,一次把“指针和数组“讲透
c语言·数据结构·算法·指针
h_a_o777oah2 小时前
【算法基础】卡特兰数:递推定义与折线对称公式推导及解题策略
c++·算法·acm·组合数学·卡特兰数·反射原理·动态规划dp