深度优先搜索(DFS)是一种用于遍历或搜索树或图的算法。该算法会尽可能深地搜索树的分支。当节点v的所在边都已被探寻过,搜索将回溯到发现节点v的那条边的起始节点。这个过程一直进行到已发现从源节点可达的所有节点为止。如果还存在未被发现的节点,则选择其中一个作为源节点并重复以上过程,整个进程反复进行直到所有节点都被访问为止。
优点:
缺点:
虽然DFS本身是一个算法,但有一些基于DFS的常用算法和变体:
以下是使用Java语言编写的深度优先搜索(DFS)的示例代码,该代码适用于无向图:
首先,我们需要定义一个表示图的类,这里我们使用邻接列表来表示图:
import java.util.*;
class Graph {
private int V; // 顶点数量
private LinkedList<Integer> adj[]; // 邻接列表
// 构造函数
Graph(int v) {
V = v;
adj = new LinkedList[v];
for (int i=0; i<v; ++i)
adj[i] = new LinkedList();
}
// 添加边
void addEdge(int v, int w) {
adj[v].add(w);
// 因为是无向图,所以也要添加反向边
adj[w].add(v);
}
// DFS遍历
void DFS(int v, boolean visited[]) {
// 标记当前节点为已访问
visited[v] = true;
System.out.print(v+" ");
// 递归访问所有未访问的邻居节点
Iterator<Integer> i = adj[v].listIterator();
while (i.hasNext()) {
int n = i.next();
if (!visited[n])
DFS(n, visited);
}
}
// DFS遍历的入口函数
void DFS(int v) {
boolean visited[] = new boolean[V];
// 调用递归函数进行DFS遍历
DFS(v, visited);
}
}
// 主类
public class Main {
public static void main(String args[]) {
// 创建一个图,包含5个顶点
Graph g = new Graph(5);
g.addEdge(0, 1);
g.addEdge(0, 4);
g.addEdge(1, 2);
g.addEdge(1, 3);
g.addEdge(1, 4);
g.addEdge(2, 3);
g.addEdge(3, 4);
System.out.println("Depth First Traversal (starting from vertex 0):");
// 从顶点0开始进行DFS遍历
g.DFS(0);
}
}在上面的代码中,Graph 类用于表示一个图,并且实现了 addEdge 方法来添加边和 DFS 方法来进行深度优先搜索。主函数 main 中创建了一个 Graph 对象并添加了边,然后调用 DFS 方法从顶点0开始进行深度优先遍历。
运行上述代码,你将看到从顶点0开始的深度优先遍历结果。在这个例子中,输出将是 0 1 4 3 2(遍历的顺序可能因具体实现和图的结构而有所不同,但会访问所有节点一次)。