图的广度优先遍历

图的广度优先遍历与树的广度优先遍历差不多,可以说跟树的层级遍历差不多,但是还是有区别的,这个区别体现在图与树的区别,也就是说图可能有环路,而树是不可能有环路的。所以对于相同的节点,我们要尽量避免多次遍历。

例如在下面的图中:


这里写图片描述

假设开始节点为2,那么2可以到达0,也可以到达3,那么此时此刻的遍历序列为2,0,3,再看0,0可以到达1,也可以到达2,1没遍历过,添加到遍历序列中,此时遍历序列为2,0,3,1,再看2,一看遍历过了,就不再考虑了。再看3只能到达3,那么3以及遍历过了,也不管了,再看1,1只能到达2,同样2已经遍历过了,所以也就不添加了。

所以这个图的宽度优先遍历为2,0,3,1。

至于确定一个节点有没有遍历过,为每一个节点加一个boolean类型的标签就可以,初始值全部为false,一旦遍历了,则标记为true,遍历检查时如果为false则修改为true,添加遍历序列,如果为true则略过。

public class Graph {
    private int V;   // No. of vertices
    private LinkedList<Integer> adj[]; //Adjacency Lists

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

    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 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.println("Following is Breadth First Traversal (starting from vertex 2)");

        g.BFS(2);
    }
}

输出:

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

时间复杂度是O(V+E),其中V是图中节点数,E是边的数目。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值