深度优先搜索(DFS)是一种用于遍历或搜索树结构或图结构的算法。DFS探索尽可能深的分支,直到到达末端,然后回溯到最近的分叉点再探索未遍历的分支。可以通过递归或使用栈实现非递归版本的DFS。
下面是一个Java实现的深度优先搜索的例子,用于遍历图结构。我们将创建一个Graph
类来表示图,并在其中实现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); // 将 w 添加到 v 的链表中
}
// 从给定的节点开始进行DFS
void DFS(int v) {
// 标记所有的顶点为未访问
boolean visited[] = new boolean[V];
// 调用递归帮助函数进行DFS遍历
DFSUtil(v, visited);
}
// DFS的递归方法
void DFSUtil(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])
DFSUtil(n, visited);
}
}
// 主函数
public static void main(String args[]) {
Graph g = new Graph(4);
g.addEdge(0, 1);
g.addEdge(0, 2);
g.addEdge(1, 2);
g.addEdge(2, 0);
g.addEdge(2, 3);
g.addEdge(3, 3);
System.out.println("深度优先遍历,从顶点 2 开始:");
g.DFS(2);
}
}
在以上代码中,我们首先定义了一个图类Graph
,它包含了一个顶点数量V
和一个邻接表adj
来存储图的边。addEdge
方法用于添加一条边到图中。DFS
方法是深度优先搜索的入口点,它初始化一个访问数组,然后调用递归的DFSUtil
方法来实际进行搜索。
DFSUtil
方法会打印当前节点,然后迭代访问所有未访问的邻接顶点。通过递归调用DFSUtil
,算法能够深入到每一个分支。
最后,在main
方法中,我们创建了一个图的实例,添加了一些边,然后从顶点2开始进行深度优先搜索。
请注意,在实际应用中,图可能包含环,这种情况下,需要确保我们不会无限地访问同一节点。在本例中,visited
数组确保了每个节点只会被访问一次,防止了可能的无限循环。