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 的所有邻居节点。如果邻居节点未被访问过,则将其推入栈中,并将其标记为已访问。这样可以确保我们按照深度优先的顺序继续探索未访问的节点。最后,我们处理当前节点,并继续下一个循环。

步骤 4: