欢迎访问宙启技术站
智能推送

Java中如何使用函数实现无向图的深度优先遍历算法?

发布时间:2023-05-23 19:04:06

无向图的深度优先遍历算法,在Java语言中可以使用递归函数来实现。这种算法可以遍历完整个图,并且保证每个节点都被访问且仅被访问一次。下面将详细介绍使用函数实现无向图的深度优先遍历算法。

1. 创建图数据结构

为了实现无向图的深度优先遍历,首先需要创建图的数据结构。一般情况下,可以使用邻接表或邻接矩阵来表示图。在这里,我们使用邻接表来表示图。邻接表是由若干个链表组成的数据结构,每个链表存储与该节点相连的其他节点信息。

// graph类定义

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); // 将w添加到v的链表中

        adj[w].add(v); // 将v添加到w的链表中

    }

}

2. 创建深度优先遍历函数

创建一个递归函数,用于遍历无向图中的每个节点,保证每个节点都被访问且仅被访问一次。

// 深度优先遍历函数定义

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);

    }

}

3. 创建遍历函数

创建一个遍历函数,用于遍历整个无向图。

// 遍历函数定义

void dfs(int v) {

    boolean visited[] = new boolean[V]; // 创建一个标记数组,标记每个节点是否被访问过

    dfsUtil(v, visited); // 调用深度优先遍历函数

}

完整代码如下:

// Java程序实现无向图的深度优先遍历算法

import java.io.*; 

import java.util.*; 

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); 

        adj[w].add(v); 

    } 

    // 深度优先遍历函数

    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 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, 3); 

        System.out.println("图的深度优先遍历顺序为:"); 

        g.dfs(0); 

    } 

输出结果为:

图的深度优先遍历顺序为:

0 1 2 3 

在本示例中,输出的结果是按照节点的访问顺序进行输出的。算法的时间复杂度是O(V+E),其中V表示节点数量,E表示边数量。

总结:

无向图的深度优先遍历算法,在Java语言中可以使用递归函数来实现。首先需要创建图的数据结构,然后创建一个递归函数,用于遍历无向图中的每个节点。最后创建一个遍历函数,用于遍历整个无向图。算法的时间复杂度是O(V+E),其中V表示节点数量,E表示边数量。