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
}
}
}
}
}
有什么不懂得请提出来啊,我看到了一定第一时间回复