一,广度优先遍历,又称为广度优先搜索,简称BFS。举例说明,在一套房子里找一个钥匙,利用深度优先搜索就是搜索每一个房间,而广度优先搜索,是先看看钥匙有没有放在各个房间的明显位置,如果没有,再看看各个房间的抽屉有没有,这样逐步扩大查找的范围的方式我们称之为广度优先搜索。
图1 示例图
从图1中可以看到右边的图形看着很整洁好看,深度优先遍历类似于树的前序遍历,广度优先遍历就类似于右边的树的层序遍历,一层一层逐步往下直到遍历完所有的顶点为止。要是实现图1中右边的图的遍历,可以使用队列来实现:
图2 队列实现图
在图2中可以看到,出队列的顺序就是ABFCIGEDH。
二,邻接矩阵的广度优先遍历
//邻接矩阵的广度遍历算法
void BFSTraverse(MGraph G) //传进来一个图G
{
int i,j;
Queue Q; //增加一个队列
for( i=0; i<G.numVertexes; i++) //创建一个是否被访问的标志,numVertexes是记录一个顶点数的元素
{
visited[i] = FALSE; //这个数组来存放是否被访问的标志,初始化为FALSE
}
initQueue(&Q); //初始化队列
for(i=0;i<G.numVertexes; i++)
{
if(!visited[i) //没有被访问过的时候才进行执行以下操作
{
printf("%c",G.vex[i]); //打印访问的顶点
visited[i] = TRUE; //标志为已经访问
EnQueue(&Q,i); //插入队列
while(!QueueEmpty(Q) //建立一个迭代,只要队列不为空就进行循环迭代
{
DeQueue(&Q, &i); //弹出队列,存放i这个变量里面
for(j=0;j<G.numVertexes;j++)
{
if(G.art[i][j]==1 && !visited[j])//判断说从i到j是否有边连接起来,如果连接了即结果为1.或者判断j没有被访问过
{
printf("%c",G.vex[j]); //打印结点
visited[j] = TRUE; //标记为已经访问
EnQueue(&Q, j); //插入队列
}
}
}
}
}
}
代码具体的说明已经在程序注释中写的很清楚了。