深度优先遍历
深度优先搜索(DFS,Depth-First Search)是一种常见的图遍历算法。它沿着图的深度遍历图的节点,尽可能深地搜索图的分支。一旦到达无法前进的节点,就返回到最近的一个有未搜索分支的节点,继续搜索。整个过程可以用递归实现,也可以用栈来实现。DFS在找到目标节点的路径时比较有效,但不保证找到最短路径。
具体来说,DFS从图的某个节点开始,标记该节点为已访问,然后访问它的所有未访问过的相邻节点,并对每个相邻节点递归地执行同样的操作。这样,DFS遍历整个图,直到所有节点都被访问为止。
以下是DFS的Java代码实现:
public 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);
}
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);
}
}
}
void DFS(int v) {
boolean visited[] = new boolean[V];
DFSUtil(v, visited);
}
}
public class Main {
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("Following is Depth First Traversal " + "(starting from vertex 2)");
g.DFS(2);
}
}
在这个例子中,我们使用邻接表来表示图,其中的DFS方法以一个节点为参数,从该节点开始遍历整个图。我们使用一个visited数组来跟踪哪些节点已经被访问。在遍历过程中,每访问一个节点,我们将其标记为已访问,并递归访问其所有未访问的邻居节点。