BFS算法(这根本就不是一个递归算法)

BFS算法

**学习总结:**一开始一直以为和DFS算法一样,都是递归的,DFS算法递归结束的条件是stack.empty(),BFS算法也按这个条件结束递归(queue.isEmpty())的话,导致递归不能结束,最后溢出报错,因为队列中一直有数据,这也就是为什么递归一直结束不了的原因。后来就想怎样才能结束递归,满足什么条件才能结束递归,想啊想,直到吃饭也没想出来,后来随便从网上找了一个视频,人家说BFS根本就不是一个递归算法,看完之后恍然大悟,遂作此文。

BFS又叫广度或者宽度优先算法,类似与二叉树的层序遍历。规则如下:

public class BFS{
    HashMap<Integer,List<Integer>> roots=new HashMap<>();
    public void init(){
        roots.put(1,Arrays.asList(2,3,4));
        roots.put(2,Arrays.asList(1,5));
        roots.put(3,Arrays.asList(1));
        roots.put(4,Arrays.asList(1));
        roots.put(5,Arrays.asList(2));  //创建邻接表,存储每个结点和它相邻的所有结点
    }
    public static void main(String[] args){
    	BFS bfs=new BFS();
        bfs.init();
        bfs.BFS(1);
    }
    HashMap<Integer,Boolean> status=new HashMap<>(); //存储被访问过的结点,如果被访问过记为true
    Queue<Integer> queue=new LinkedList<>();//创建队列,BFS需要队列这种数据结构
    public void BFS(int startPoint){			//queue只是一个接口,实现类使用LinkedList
        queue.add(startPoint);
        status.put(startPoint,true);
        while(!queue.isEmpty()){	//队列为空结束循环
            int vertax=queue.poll();//每次循环都取队列的第一个数字
            System.out.print(vertax);
            List<Integer> list=roots.get(vertax);//取这个节点相邻的所有结点
            for(int point:list){
                if(!status.getOrDefault(point,false)){
                 	if(queue.contains(point)){
                  		continue;
                	}
                	queue.add(point);//这个结点没有被访问过,添加到队列
                	status.put(point,true);//修改状态为true   
                }
            }
        }
    }
}

有什么不懂得请提出来啊,我看到了一定第一时间回复

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值