广度优先遍历
1 广度优先遍历比喻:
如果在家里找东西,有四个卧室,深度优先就是,先将每个卧室可能存在的丢失东西的地方着一边,一级级找下去,以此下去
2 代码解析:
1) 邻接矩阵结构:
void BFSTraverse(MGraph G)
{
int i,j;
Quese Q; //存储某个顶点的儿子结点信息 的队列
for(i = 0; i < G.numVertex;i++)
{
visited[i] = false; //初始化记录顶点是否被访问过 信息的数组
}
InitQueue(&Q); //初始化队列
for(i = 0; i < G.numVertex;i++)
{
if(!visited[i])
{
visited[i] = true;
cout <<G.vexs[i] << endl; //可以是其他的操作
EnQueue(&Q,i); //将顶点I 推进队列
while(!QueseEmpty(Q)) //队列不为空
{
DeQueue(&Q,&i); //将队列中头元素出列,赋值给i
for(j = 0; j< G.numVertex; j++)
{
//遍历所有顶点,找出与当前顶点有边的顶点,并且没有备访问过
if(G,arc[i][j]== 1 && !visited[j])
{
visited[j]= true;
cout<< G.vexs[j] << endl;
EnQueue(&Q,j); //将顶点j推进队列
}
}
}
}
}
}
2) 邻接表结构:
voidBFSTraverse(GrapgAglist G)
{
int i,j;
Quese Q;
for(i = 0; i < G.numVertex;i++)
{
visited[i] = false;
}
InitQueue(&Q);
EdgeNode *p;
for(i = 0; i < G.numVertex;i++)
{
if(!visited[i])
{
visited[i] = true;
cout <<G.vexs[i] << endl;
EnQueue(&Q,i);
while(!QueseEmpty(Q))
{
p =G.adjust[i].firstedge;
DeQueue(&Q,&i);
while(p)
{
if(!visited[p->adjvex])
{
visited[p->adjvex]= true;
cout<< G.adjust[p->adjvex].data << endl;
EnQueue(&Q,j);
}
p =p->next;
}
}
}
}
}
3 注意点:
1) 队列Q。存储某个顶点拥有的儿子结点,每当要遍历某个顶点的孩子结点时,先将顶点退出队列
2) 队列不为空,则说明还有顶点没有遍历到
部分代码摘抄自《大话数据结构》