各位看官们,大家好,上一回中咱们说的是深度优先遍历的例子,这一回咱们说的例子是:广度优先遍历。
闲话休提,言归正转。让我们一起talk C栗子吧!
看官们,广度优先遍历也是一种遍历图的方法,可以把它当作深度优先遍历的兄弟。它的原理:首先选择
图中某个点做为起点,然后遍历与该点相连而且没有被访问的点,接着遍历与该点相连而且没有被访问的
另外一个点,继续访问与该点相连的其它点,直到与该点相连的所有点都被访问为止;接着再选一个没有
访问点,重复上面的过程,直到图中所有的点都被访问过为止。这个点哪个点的,是不是大家觉得像绕口
令呢,哈哈。概要地说:广度优先遍历是一种步步为营的过程,它会依次遍历某个点附近的点,直到遍历
完图中所有点为止。下面是具体的实现步骤:
- 1.使用邻接矩阵存放图,邻接矩阵中位于行和列上面点的顺序可以自己定义;
- 2.把图中点的名称按照点在邻接矩阵中行或者列上的顺序存放一个数组中;
- 3.使用一个数组来标记各个点是否被访问过,数组的大小为图中点的数量;
- 4.从邻接矩阵中,选取一个点依次遍历图,通常选择第一个点;
- 5.把该点在邻接矩阵中的列数加入到队列中;
- 6.在步骤3中的数组中标记该点已经被访问过;
- 7.将队列中的元素出队,把该元素的值当作邻接矩阵的行数;
- 8.查找邻接矩阵中位于该行的点与其它点之间是否有路径,如果没有路径返回步骤7,否则进行步骤9;
- 9.判断有路径的点是否被访问过。如果已经被访问过,回到步骤7,否则回到步骤5;
- 10.重复步骤7到9,直到队列中没有元素为止;
看官们,正文中就不写代码了,详细的代码放到了我的资源中,大家可以点击这里下载使用。
我们在例子中使用了队列,通过队列来控制遍历的广度。例子中关于队列的代码写的比较粗糙,更好的代
码请点击这里查看我们在前面章回中关于队列的讲解。程序中使用的图和上一回中的图一样,下面是图及
其邻接矩阵:
基于该图的运行结果如下所示:
--- Show the Graph ---
0 |1 |1 |0 |0 |0 |
1 |0 |0 |0 |1 |0 |
1 |0 |0 |1 |0 |1 |
0 |0 |1 |0 |0 |0 |
0 |1 |0 |0 |0 |1 |
0 |0 |1 |1 |1 |0 |
--- BFS ---
A->B->C->E->D->F->
各位看官,关于广度优先遍历的例子咱们就说到这里。欲知后面还有什么例子,且听下回分解。