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

本文介绍了如何使用非递归算法来实现图的广度优先遍历(BFS)。通过邻接矩阵作为数据结构,利用队列存储访问顺序,遍历每个节点的邻接点并标记已访问,直至队列为空。
  • 对于广度优先遍历,使用递归方式实现非常普遍,这里我们讨论一下如何使用非递归来实现

算法

  • 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();
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值