深度优先遍历,也称深度优先查找、深度优先搜索等。

基本思想

假设初始状态时图中所有顶点都未曾被访问,则深度优先遍历算法从图中某个顶点(任一顶点)出发,访问此顶点并把该顶点标记为已访问,然后依次从该顶点邻接的未被访问的顶点出发,深度优先遍历图,直至图中所有和该顶点有路径相通的顶点都被访问到;若此时图中尚有顶点未被访问,则另选图中一个未被访问的顶点作为起始点,重复上述过程,直至图中所有顶点都被访问到为止。

伪代码实现

假设图G(V, E)表示要遍历的图,深度优先遍历的伪代码实现如下:

使用邻接矩阵或邻接表表示图G(V, E)
使用visited[VertexCount]数组记录顶点是否已被访问,其中true表示已访问,false表示未访问
for i=0;i<VertexCount;i++ then
    visited[i] = false
for each vertex v in V then
    if(v is not visited) then
        dfs(v)
dfs(v)
    visited[v] = true
    for(each vertex w in v's adjacent V') then
        if(w is not visited) then
            dfs(w)

该算法的输入规模与图的顶点个数|V|和边的个数|E|有关。由于该算法的递推关系式不容易表示,所以在计算其算法效率时换一种思路。宏观上,在遍历图时,对图中的每个顶点至多调用一次递归,因为一旦某个顶点被标记为已被访问,就不基于该节点去遍历。因此,遍历图的过程实质上就是对每个顶点查找邻接点的过程。所以,不同的存储结构,其算法效率不同。对于使用二维数组表示的邻接矩阵时,查找每个顶点的邻接点所需的时间为深度优先遍历实现java 深度优先遍历算法代码_深度优先遍历实现java。而当使用邻接表时,由于临邻接点可以使用链表存储,所以查找每个顶点的邻接点所需的时间为深度优先遍历实现java 深度优先遍历算法代码_深度优先遍历实现java_02

参考

《数据结构 严蔚敏 吴伟民 著
《算法设计与分析基础》 第三版 Anany Levitin 著 潘彦 译
图的深度优先遍历(DFS)
https://leetcode-cn.com/circle/article/YLb5l4/ 图文详解 BFS, DFS
leetcode高频题笔记之DFS和BFS