淘先锋技术网

首页 1 2 3 4 5 6 7

何为广度优先遍历呢?

广度优先遍历(BFS),又叫宽度优先搜索或横向优先搜索,是从根结点开始沿着树的宽度搜索遍历,将离根节点最近的节点先遍历出来,在继续深挖下去。

基本思想是:

1、从图中某个顶点V0出发,并访问此顶点;

2、从V0出发,访问V0的各个未曾访问的邻接点W1,W2,…,Wk;然后,依次从W1,W2,…,Wk出发访问各自未被访问的邻接点;

3、重复步骤2,直到全部顶点都被访问为止。

下面给出广度优先遍历的例子:(广度优先遍历不是唯一的哦,只要满足“广度”的含义即可)

访问顺序为:0,2,1,5,3,4(看图很快就可得知)(将离根节点最近的节点先遍历出来,再继续深挖下去。)

8d40f0a4947302a063d9dab8c46712e3.png

bda82450956cb7381656950978f465ab.png

知道了BFS之后,我们又要怎么通过编程来实现BFS呢?

下面给上详细的分析:

首先,先准备一个队列(利用队列的结构)和一个Set(Set用来作为类似于注册的作用,防止节点重复进入队列)

step1.先把根节点1放入队列中,同时将1注册到set中去,证实它进过队列(上面两步是同步的)

step2.把1poll出来,同时打印出来(System.out...)(前面两步也是同步的),同时将1的所有next节点都放到队列中去(放到队列中去时要提前判断这些元素之前是否有注册过,即有没有在set中)

step3.如果一个节点已经没有next节点的时候,那就直接将该节点弹出去就行,不用注册也不用添加到队列中。

下面流程图可以用来参考,下面也有源代码,源代码有注释,很好理解,看不清楚的欢迎留言~

f1accdd69d6c20bb9e65e196d716fa07.png

bda82450956cb7381656950978f465ab.png

4a055642806b3a2ba483f8f5d6ded44a.png

bda82450956cb7381656950978f465ab.png

下面附上源代码:

46116848ae930c6b7007fb0db7ecb593.png

bda82450956cb7381656950978f465ab.png