bfs——练习demo2(20届周新杰提供)

广度优先搜索
和深搜不同广搜会沿着树的高度和宽度对节点进行依次遍历
从树的根节点a开始,会发现a的子节点有c、d、f三个子节点,进程会先对这三个节点进行访问然后再访问其的子节点
对c、d、f完成访问之后进行则会探寻这三个节点的子节点并对其进行遍历,可以从图中看出他们的子节点有c、g、e
可以看出c、g、e没有子节点了所以程序对其遍历之后随之结束 

package test;

import java.util.LinkedList;
import java.util.Queue;

public class bfs {
	 // 构造图的边
    private int[][] edges = { 
    		{0,0,1,1,0,1,0},
			{0,0,1,0,0,0,0},
			{1,1,0,1,0,0,0},
			{1,0,1,0,0,0,0},
			{0,0,0,0,0,0,1},
			{1,0,0,0,0,0,1},
			{0,0,0,0,1,1,0}
            };
    // 构造图的顶点
    private String[] vertexs = { "a", "b", "c", "d", "e", "f", "g" };
    // 记录被访问顶点
    private boolean[] verStatus;
    // 顶点个数
    private int vertexsNum = vertexs.length;
    // 广搜
    private void BFS() {
        verStatus = new boolean[vertexsNum];
        Queue<Integer> temp = new LinkedList<Integer>();
        //遍历每个节点
        for (int i = 0; i < vertexsNum; i++) {
        	//判断当前节点是否被访问过
            if (!verStatus[i]) {//如果没有被访问的话则将其加入队列
                System.out.print(vertexs[i] + " ");
                verStatus[i] = true;
                temp.offer(i);
                while (!temp.isEmpty()) {
                	//将最先进入队列的节点移除
                    int j = temp.poll();
                    //广度搜索子节点
                    for (int k = firstAdjvex(j); k >= 0; k = nextAdjvex(j, k)) {
                        if (!verStatus[k]) {
                            System.out.print(vertexs[k] + " ");
                            verStatus[k] = true;
                            temp.offer(k);
                        }
                    }
                }
            }
        }
    }
    // 返回与i相连的第一个顶点
    private int firstAdjvex(int i) {
        for (int j = 0; j < vertexsNum; j++) {
            if (edges[i][j] > 0) {
                return j;
            }
        }
        return -1;
    }
    // 返回与i相连的下一个顶点
    private int nextAdjvex(int i, int k) {
        for (int j = (k + 1); j < vertexsNum; j++) {
            if (edges[i][j] > 0) {
                return j;
            }
        }
        return -1;
    }

    // 测试
    public static void main(String args[]) {
        new bfs().BFS();
    }
}

广搜结果

a c d f b g e 

猜你喜欢

转载自blog.csdn.net/feng8403000/article/details/123591906