学习笔记|算法——广度优先搜索算法(BFS)

本文详细介绍了广度优先搜索(BFS)算法,这是一种用于遍历或搜索树或图的算法。核心思想是通过队列进行层次推进,首先访问最近的节点,再依次访问其相邻节点。主要涉及visited数组记录已访问状态,queue存储待访问节点,prev数组记录反向路径。BFS不仅应用于图的遍历,还可用于二叉树的循环遍历。理解并掌握BFS有助于解决各种图论和数据结构问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

广度优先搜索算法(BFS)
一种“地毯式”层层推进的搜索策略,即先查找离起始顶点最近的,然后是次近的,依次往外搜索。
广度优先算法示意图
主要依靠三个变量:visited、queue、prev
visited记录已经被访问的顶点,避免顶点被重复访问
queue是一个队列(主要利用队列先进先出的特性),用来存储已被访问、但相连的顶点还没有被访问的顶点。作用:当访问到第K层的顶点时,将第K层顶点记录下来,稍后通过第K层的顶点找第K+1层的顶点。

int w = queue.poll();
for(int i = 0;i<adj[w].size();i++){
	int q = adj[w].get(i);
}
//w是第K层的顶点,q是第K+1层的顶点,通过for循环遍历第K+1层

prev记录搜索路径,不过这个路径是反向的,需要用一个递归函数输出。prev[w]存储的是,顶点w是从哪个前驱顶点遍历过来的。

private void print(int[] prev,int s,int t){
	if(prev[t] != -1 && s != t){
		print(prev,s,t);
	}
	System.out.print(t + " ");
}
		

代码思路:
1、先判断一下 s和t是不是相同点,如果是,直接return
2、建Queue<Integer> queue,boolean[] visited,int[] prev。把int[] prev初始化
3、将开始起点传入queue中
4、while循环,条件为queue不为空
5、将队首的元素取出来,通过邻接表找到与之相连的顶点,for循环将所有的次层元素遍历出来
6、通过visited[],判断次层元素是否已经访问过
7、如果没有访问过,首先存储路径 prev[q] = w,然后看一下q是不是要找的终点。若不是 将q存储到queue中,将visited[q]标记为true,代表已访问
8、while循环直到找到终点

二叉树循环遍历,也采用这种思想
建一个queue,用来存储孩子节点
建一个list用来存储遍历到的节点
将根节点装到queue中,通过while循环,不断取queue中的节点,同时看其孩子节点是不是null,若不是,则将他们入队列
剑指Offer32

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值