DFS(深度优先搜索) Java 实现
引言
在本文中,我将向你介绍如何使用 Java 实现深度优先搜索(DFS)。DFS 是一种用于遍历或搜索图和树的算法。它以深度为优先级,首先探索尽可能深的节点,直到找到目标节点或无法继续深入为止。
整体流程
下表展示了实现 DFS 的整体流程:
步骤 | 描述 |
---|---|
1 | 创建一个栈 (Stack) 用于存储待访问的节点。初始化栈,并将起始节点推入栈中。 |
2 | 创建一个布尔数组 (visited) 用于跟踪节点的访问状态。初始化数组,并将起始节点标记为已访问。 |
3 | 当栈不为空时,执行以下操作:<br> a. 弹出栈顶节点,将其存储在变量 current 中。<br> b. 遍历 current 的所有邻居节点:<br> i. 如果邻居节点未被访问,则将其推入栈中,并标记为已访问。<br> ii. 如果邻居节点已经被访问过,则继续遍历下一个邻居节点。<br> c. 标记 current 节点为已处理。 |
4 | 重复步骤 3,直到栈为空。 |
现在,让我们逐步实现这些步骤。
步骤 1:创建栈和初始化起始节点
首先,我们需要创建一个栈来存储待访问的节点。Java 提供了 Stack
类来实现栈的功能。我们使用 Stack
类来创建一个栈:
import java.util.Stack;
Stack<Node> stack = new Stack<>();
接下来,我们需要初始化起始节点,并将其推入栈中。假设我们有一个节点类 Node
,具有邻居节点列表和值属性。我们可以使用以下代码创建起始节点并将其推入栈中:
Node startNode = new Node(value); // 创建起始节点
stack.push(startNode); // 将起始节点推入栈中
步骤 2:创建并初始化访问状态数组
我们需要一个数组来跟踪节点的访问状态。对于每个节点,我们将使用一个布尔值来表示其是否已被访问。我们可以使用以下代码来创建和初始化一个布尔数组 visited
:
boolean[] visited = new boolean[numNodes]; // numNodes 是图或树中节点的总数
// 将所有节点标记为未访问
Arrays.fill(visited, false);
以上代码使用 Arrays.fill()
方法将 visited
数组的所有元素设置为 false
,表示所有节点都未被访问。
步骤 3:执行深度优先搜索
现在,我们需要实现深度优先搜索的主要逻辑。我们将使用一个循环来遍历栈中的节点,直到栈为空为止。
while (!stack.isEmpty()) {
Node current = stack.pop(); // 弹出栈顶节点
// 遍历 current 的邻居节点
for (Node neighbor : current.getNeighbors()) {
if (!visited[neighbor.getValue()]) {
stack.push(neighbor); // 将未访问的邻居节点推入栈中
visited[neighbor.getValue()] = true; // 标记邻居节点为已访问
}
}
// 处理当前节点
// ...
}
在上述代码中,我们首先弹出栈顶节点,并将其存储在 current
变量中。然后,我们遍历 current
的所有邻居节点。如果邻居节点未被访问过,则将其推入栈中,并将其标记为已访问。这样可以确保我们按照深度优先的顺序继续探索未访问的节点。最后,我们处理当前节点,并继续下一个循环。