图的两种遍历方式--深度与广度优先遍历

     1.图的广度优先遍历
           思路:
                 <1>定义一个队列,用于保存依次访问与其构成边的顶点.队列是先进先出的可以达到顶点遍历的有序,例如如下图:

         保存队列
          <2>然后依次循环,顺序的处理每一个顶点,输出顶点的要求是这两个顶点可以构成边。其没有被访问过即IsTrav==0;
      
定义队列:Queue Q; 进队函数: QueueIn(G *g,int i):
  出队函数:QueueOut(G *g,int i);  判空:IsEmpty(G* g);
伪代码:
  G g;   int i,j,k;
  for(i=0;i<G->VertexNum;i++)
      if(!G->IsTrav[i])
         {
           G->IsTrav[i]=1;       //当前顶点被访问,标记为已访问
           QueueIn(&g,i);         
           printf(g.Vertex[i]);
           while(!IsEmpty(g))      //依次处理和当前顶点构成边的顶点
           {
                QueueOut(&g,&k);
                for(j=0;j<G->VertexNum;j++)
                    if(!G->IsTrav[j] && G->Vertex[k][j]!=MAXVALUE)
                         {
                             printf(g.Vertex[j]);
                             QueueIn(&g,j);
                             g.IsTrav[j]=1;
                         }
              }
           } 
   2.深度优先遍历
        思路:
           <1>深度优先遍历用到了递归的方法
           <2>依次循环访问每一个顶点
           <3>递归时,将访问到的顶点标记为已访问IsTrav[i]=1;并输出
      为代码:
           
  G g;   int i,j,k;
  for(i=0;i<G->VertexNum;i++)
      if(!G->IsTrav[i])
             DFS(&g,i);

int DFS(G *g,int i)
{
      int j;
      G->IsTrav[i]=1;  
      printf(g.Vertex[i]);
      for(j=0;j<G->VertexNum;j++)
      if(!G->IsTrav[j] && G->Vertex[k][j]!=MAXVALUE)
                            DFS(g,j);
}
            
 
               

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值