对“广度优先遍历”的理解

 广度优先遍历

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)      队列不为空,则说明还有顶点没有遍历到

部分代码摘抄自《大话数据结构》


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值