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

广度优先搜索算法(BFS)
一种“地毯式”层层推进的搜索策略,即先查找离起始顶点最近的,然后是次近的,依次往外搜索。
学习笔记|算法——广度优先搜索算法(BFS)_第1张图片
主要依靠三个变量: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 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

你可能感兴趣的:(算法,数据结构,java)