深度优先搜索(DFS)是一种用于图遍历的算法,它从一个起始节点开始,尽可能深地探索图的分支,直到到达最深的节点,然后回溯到上一个未探索的节点,继续探索其他分支。DFS通过使用栈来保存待访问的节点。
DFS主要用于解决以下问题:
这个代码演示了如何使用DFS遍历一个图。首先创建了一个Node类来表示图中的节点,每个节点包含一个值、一个相邻节点列表和一个表示是否已访问的标志。然后在DFS类中实现了一个dfs方法,使用栈来保存待访问的节点。在dfs方法中,首先将起始节点压入栈中,然后循环直到栈为空。在循环中,从栈中弹出一个节点,如果该节点未被访问过,则输出其值,并将其标记为已访问。然后遍历该节点的邻居节点,将未被访问过的邻居节点压入栈中。最后,在main方法中创建了一个图,并从节点1开始进行DFS遍历。
import java.util.ArrayList;
import java.util.List;
import java.util.Stack;
class Node {
int value;
List neighbors;
boolean visited;
public Node(int value) {
this.value = value;
this.neighbors = new ArrayList<>();
this.visited = false;
}
}
public class DFS {
public static void dfs(Node start) {
Stack stack = new Stack<>();
stack.push(start);
while (!stack.isEmpty()) {
Node current = stack.pop();
if (!current.visited) {
System.out.println(current.value);
current.visited = true;
for (Node neighbor : current.neighbors) {
if (!neighbor.visited) {
stack.push(neighbor);
}
}
}
}
}
public static void main(String[] args) {
// 创建图
Node node1 = new Node(1);
Node node2 = new Node(2);
Node node3 = new Node(3);
Node node4 = new Node(4);
Node node5 = new Node(5);
// 建立节点之间的连接关系
node1.neighbors.add(node2);
node1.neighbors.add(node3);
node2.neighbors.add(node4);
node3.neighbors.add(node4);
node4.neighbors.add(node5);
// 从节点1开始进行DFS
dfs(node1);
}
}