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

利用Java函数实现图的深度优先遍历和广度优先遍历?

发布时间:2023-07-04 12:57:49

Java中,可以通过使用递归函数实现图的深度优先遍历(DFS)和使用队列实现图的广度优先遍历(BFS)。

首先,需要定义一个图的类,其中包含图的顶点数目和邻接矩阵来表示图的连接关系。然后,可以通过以下步骤实现DFS和BFS。

深度优先遍历(DFS):

1. 定义一个布尔数组来标记顶点是否已经被访问。

2. 从一个未被访问的顶点开始遍历。

3. 首先将该顶点标记为已访问,并输出该顶点的值。

4. 遍历该顶点的邻接顶点。

5. 递归调用DFS函数对邻接顶点进行遍历,直到所有顶点都被访问。

下面是Java代码示例:

class Graph {
    private int v; // 顶点的个数
    private LinkedList<Integer> adj[]; // 邻接表

    Graph(int v) {
        this.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);
    }

    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 class Main {
    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, 0);
        g.addEdge(2, 3);
        g.addEdge(3, 3);

        System.out.print("Depth First Traversal (starting from vertex 2): ");
        g.DFS(2);
    }
}

输出结果:

Depth First Traversal (starting from vertex 2): 2 0 1 3

广度优先遍历(BFS):

1. 定义一个布尔数组来标记顶点是否已经被访问。

2. 创建一个队列,并将起始顶点加入队列。

3.从队列中取出一个顶点,并打印输出。

4. 遍历该顶点的邻接顶点。

5. 若邻接顶点没有被访问过,则将其加入队列中,并标记为已访问。

6. 重复步骤3到5,直到队列为空。

下面是Java代码示例:

import java.util.*;

class Graph {
    private int v; // 顶点的个数
    private LinkedList<Integer> adj[]; // 邻接表

    Graph(int v) {
        this.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);
    }

    void BFS(int s) {
        boolean visited[] = new boolean[v];

        LinkedList<Integer> queue = new LinkedList<Integer>();

        visited[s] = true;
        queue.add(s);

        while (queue.size() != 0) {
            s = queue.poll();
            System.out.print(s + " ");

            Iterator<Integer> i = adj[s].listIterator();
            while (i.hasNext()) {
                int n = i.next();
                if (!visited[n]) {
                    visited[n] = true;
                    queue.add(n);
                }
            }
        }
    }
}

public class Main {
    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, 0);
        g.addEdge(2, 3);
        g.addEdge(3, 3);

        System.out.print("Breadth First Traversal (starting from vertex 2): ");
        g.BFS(2);
    }
}

输出结果:

Breadth First Traversal (starting from vertex 2): 2 0 3 1

以上就是使用Java函数实现图的深度优先遍历和广度优先遍历的方法。通过这些遍历算法,可以对图的结构进行完整遍历和搜索。