DFS非递归算法在Java中的实现

深度优先搜索(DFS)是一种用于遍历或搜索树或图的算法,通常使用递归实现。然而,我们也可以使用非递归方式,通过栈来模拟递归过程。本文将介绍如何在Java中实现DFS的非递归算法,并举例说明。

什么是DFS?

深度优先搜索是一种遍历算法,优先深入节点的子节点。在图形数据结构中,DFS会访问一个节点,然后尽可能深地探索每一个子节点。在遍历完一个路径后,DFS会回溯到上一个节点并继续探索其他的路径。

DFS非递归实现

使用栈来实现DFS的非递归版本。算法的基本思想是将当前节点压入栈中,然后反复弹出栈顶元素,并访问相邻的未被访问的节点并将其压入栈中,直到栈为空为止。

代码示例

下面是DFS非递归算法在Java中的具体实现示例:

import java.util.*;

class Graph {
    private int vertices; // 图的顶点数
    private LinkedList<Integer>[] adjacencyList; // 邻接表

    // 构造函数
    Graph(int v) {
        vertices = v;
        adjacencyList = new LinkedList[v];
        for (int i = 0; i < v; i++) {
            adjacencyList[i] = new LinkedList<>();
        }
    }

    // 添加边
    void addEdge(int source, int destination) {
        adjacencyList[source].add(destination);
    }

    // DFS非递归实现
    void DFS(int start) {
        boolean[] visited = new boolean[vertices]; // 记录访问状态
        Stack<Integer> stack = new Stack<>(); // 使用栈

        stack.push(start); // 入栈起始节点

        while (!stack.isEmpty()) {
            int node = stack.pop(); // 弹出栈顶元素

            if (!visited[node]) {
                System.out.print(node + " "); // 访问节点
                visited[node] = true; // 标记为已访问
            }

            // 把未访问的邻接节点入栈
            for (int neighbor : adjacencyList[node]) {
                if (!visited[neighbor]) {
                    stack.push(neighbor);
                }
            }
        }
    }
}

public class Main {
    public static void main(String[] args) {
        Graph graph = new Graph(5);
        graph.addEdge(0, 1);
        graph.addEdge(0, 2);
        graph.addEdge(1, 3);
        graph.addEdge(1, 4);
        graph.addEdge(2, 1);
        graph.addEdge(3, 4);

        System.out.println("DFS Traversal starting from vertex 0:");
        graph.DFS(0);
    }
}

代码解析

在上述代码中,我们定义了一个图的类,包含构造函数和添加边的方法。DFS算法通过栈来管理待访问节点。每次访问一个节点时,将它标记为已访问,并将它的未访问邻接节点推入栈中。

类图

在本示例中,我们可以使用以下的类图来表示Graph类的结构:

classDiagram
    class Graph {
        +int vertices
        +LinkedList<Integer>[] adjacencyList
        +addEdge(int source, int destination)
        +DFS(int start)
    }

旅行图

当我们从节点0开始DFS时,访问的节点路径可以用旅行图表示如下:

journey
    title DFS Traversal
    section Step 1
      Start from vertex 0: 5: 0
    section Step 2
      Visit vertex 1: 4: 1
    section Step 3
      Visit vertex 3: 3: 3
    section Step 4
      Visit vertex 4: 2: 4
    section Step 5
      Backtrack to vertex 1: 1: 1
    section Step 6
      Backtrack to vertex 0: 1: 0
    section Step 7
      Visit vertex 2: 2: 2

结尾

DFS非递归算法是一种有效的遍历图形结构的方法,通过栈的辅助,可以避免递归带来的栈溢出风险。理解DFS的非递归实现对于掌握图遍历算法以及实际工程应用有着重要意义。希望本篇文章能帮助你更好地理解并应用这一算法。