深度优先遍历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,写出遍历顺序。

相关推荐
贾斯汀玛尔斯1 小时前
每天学一个算法--LSM-Tree(Log-Structured Merge Tree)
java·算法·lsm-tree
浅念-5 小时前
刷穿LeetCode:BFS 解决 Flood Fill 算法
数据结构·c++·算法·leetcode·职场和发展·bfs·宽度优先
做cv的小昊6 小时前
【TJU】研究生应用统计学课程笔记(8)——第四章 线性模型(4.1 一元线性回归分析)
笔记·线性代数·算法·数学建模·回归·线性回归·概率论
贾斯汀玛尔斯6 小时前
每天学一个算法--倒排索引(Inverted Index)
算法·inverted-index
小e说说6 小时前
打破偏科困境:这些学习软件助孩子重燃学习热情
算法
月昤昽7 小时前
autoCAD二次开发 4.正多边形与collection区分
算法·c#·二次开发·autocad二次开发
休息一下接着来7 小时前
C++ 固定容量环形队列实现
c++·算法
im_AMBER8 小时前
手撕hot100之矩阵!看完这篇就AC~
javascript·数据结构·线性代数·算法·leetcode·矩阵
笨笨饿8 小时前
#79_NOP()嵌入式C语言中内联汇编宏的抽象封装模式研究
linux·c语言·网络·驱动开发·算法·硬件工程·个人开发