非递归实现广度优先遍历(BFS)

末鹿安然 提交于 2020-01-30 20:01:30
  • 对于广度优先遍历,使用递归方式实现非常普遍,这里我们讨论一下如何使用非递归来实现

算法

  • 1、以图的邻接矩阵为例
  • 2、使用一个queue来保存访问顺序,每次取队首元素,如果其有邻接点,则将其所有邻接点入队,并设置visit数组为1,最后再将其出队
  • 3、循环结束条件为:队列为空

代码实现

以下图为例
在这里插入图片描述

public class BfsIterateAdjacentMatrix {
    private static Map<Integer, String> idVertexMap = new HashMap<Integer, String>(){{
        put(0,"V0");
        put(1,"V1");
        put(2,"V2");
        put(3,"V3");
        put(4,"V4");
        put(5,"V5");
        put(6,"V6");
        put(7,"V7");

    }};

    private static int[][] adjacentMatrix = new int[][]{
            //V0,V1,V2,V3,V4,V5,V6,V7
            {0, 1, 1, 0, 0, 0, 0, 0},
            {1, 0, 0, 1, 1, 0, 0, 0},
            {1, 0, 0, 0, 0, 1, 1, 0},
            {0, 1, 0, 0, 0, 0, 0, 1},
            {0, 1, 0, 0, 0, 0, 0, 1},
            {0, 0, 1, 0, 0, 0, 0, 0},
            {0, 0, 1, 0, 0, 0, 0, 0},
            {0, 0, 0, 1, 1, 0, 0, 0},
    };

    private static int[] visited = new int[adjacentMatrix.length];

    public static void main(String[] args){
        bfs();
    }

    private static void bfs(){
        Queue<Integer> visitQueue = new LinkedBlockingQueue<>();
        visitQueue.add(0);
        int lineNo = 0;
        visited[lineNo] = 1;

        while (!visitQueue.isEmpty()){
            lineNo = visitQueue.peek();
            System.out.println("visit: " + idVertexMap.get(lineNo));
            
            for (int colNo =0; colNo < adjacentMatrix.length; colNo++){
                if (visited[colNo] ==0 && adjacentMatrix[lineNo][colNo]==1){
                    visitQueue.add(colNo);
                    visited[colNo]=1;
                }
            }
            visitQueue.poll();
        }
    }
}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!