如果说树的深搜像是树的先序遍历,那么宽搜就像是树的层序遍历。
(1)顶点v入队列。
(2)当队列非空时则继续执行,否则算法结束。
(3)出队列取得队头顶点v;访问顶点v并标记顶点v已被访问。
(4)查找顶点v的第一个邻接顶点col。
(5)若v的邻接顶点col未被访问过的,则col入队列。
(6)继续查找顶点v的另一个新的邻接顶点col,转到步骤(5)。直到顶点v的所有未被访问过的邻接点处理完。转到步骤(2)。
伪代码
(1)初始化队列Q;visited[n]=0;
(2)访问顶点v;visited[v]=1;顶点v入队列Q;
(3) while(队列Q非空)
v=队列Q的对头元素出队;
w=顶点v的第一个邻接点;
while(w存在)
如果w未访问,则访问顶点w;
visited[w]=1;
顶点w入队列Q;
w=顶点v的下一个邻接点。
**邻接矩阵的广度遍历算法
void BFSTraverse(MGaph G)
{
int i,j;
Queue Q; /*初始化一个辅助队列*/
for (i = 0; i < G.numVertexes; i++) /*对每一个顶点循环*/
visited[i] = FALSE;
InitQueue(&Q); /**/
for ( i = 0 ; i < G.numVertexes ; ++i)
{
if (!visited[i]) /*若是未访问过*/
{
visited[i] = TRUE; /*设置节点为访问过*/
printf("%c\n",G.Vexs[i]); /*打印节点也可以是其他操作*/
EnQueue(&Q,i); /*将此节点入队列*/
while(!EnQueueEmpty(Q)) /*若当前队列不为空*/
{
DeQueue(&Q,&i); /*将队中元素出队列赋值给 i*/
for ( j = 0; j < G.numVertexes; i++)
{
/*判断其他顶点 若与当前顶点存在边且未访问过*/
if (G.arc[i][j] == 1 && !visited[j])
{
visited[j] = TRUE;
//将找到的顶点标记为已访问
printf("%c\n",G.Vexs[j]);
EnQueue(&Q,j);
/*将找到的此顶点入队列*/
}
}
}
}
}
}
邻接表的广度遍历算法
void BFSTraverse(GraphAdjList GL){
int i;
EdgeNode *p;
Queue Q;
for (i = 0 ; i < GL->numVertexes ; i++)
visited[i] = FALSE;
InitQueue (&Q);
for (i = 0; i < GL->numVertexes; ++i) {
if ( !visited[ i ]) {
visited[ i ] = TRUE;
printf(" %c \n ",GL->adjlist[ i ].data ) ;
EnQueue( &Q , i ) ; //入队列
while( !QueueEmpty( Q ) ) {
DeQueue( &Q,&i ) ;
p = GL->adjlist[i].firstedge;
/*找到当前顶点 边表链表头指针*/
while(p) {
if( !visited[p->adjvex]) { //未被访问
visited[p->adjvex] = TRUE;
printf("%c\n",GL->adjlist[p->adjvex].data);
EnQueue(&Q,p->adjvex);
//将此顶点入队列
} /* i f */
p = p->next; //指针指向下一个邻接点
}/* while ( p ) */
}/* while( !QueueEmpty( Q ) ) */
} /* if ( !visited[ i ]) */
} /* for (i = 0; .... */