• 【数据结构】图的深度优先遍历


    一.图的遍历

    图的遍历需要解决的关键问题

    1.在图中,如何选取遍历的起始顶点?

    从编号小的顶点开始

    • 在线性表中,数据元素在表中的编号就是元素在序列中的位置,因而其编号是唯一的。
    • 在树中,将节点按层序编号,由于树具有层次性,因而其层序编号也是唯一的。
    • 在图中,任何两个顶点之间都可能存在边,顶点时没有确定的先后次序的,所以,顶点的编号不唯一。

    为了定义操作的方便,将图中的顶点安任意顺序排列起来,比如,按顶点的存储顺序。 

    2.从某个起始点可能到达不了所有其它顶点,怎么办?

    多次调用从某顶点出发遍历图的算法

    3.因图中可能存在回路,某些顶点可能会被重复访问,那么如何避免不会因回路而陷入死循环呢?

    附设访问标志数组visited[n] (n为结点个数)

    4.在图中,一个顶点可以和其它多个顶点相连,当这样的顶点访问过后,如何选取下一个要访问的顶点呢?

    • 深度优先遍历
    • 广度优先遍历

    二.深度优先遍历

    1.基本思想

    1)访问顶点v;

    2)从v的未被访问的邻接点中选取一个顶点w,从w出发进行深度优先遍历;

    3)重复上述两步,直至图中所有和v有路径相通的顶点都被访问到。

    2.伪代码

    • 1.访问顶点v;visited[v]=1;
    • 2.w=顶点v的第一个邻接点;
    • 3.while(w存在)
    • 3.1 if(w未被访问)从顶点w出发递归执行该算法;
    • 3.2w=顶点v的下一个邻接点;

    3.代码实现

    3.1 邻接矩阵

    1. template<class T>
    2. void MGraph::DFSTraverse(int v){
    3. bool visited[vertexNum]=false;//设置标志数组
    4. int w,i,count=0;
    5. cout<//访问顶点v
    6. visited[v]=true;//标志数组置为true
    7. ++count;//结点访问一次,计数器加一
    8. for(i=0;i
    9. if(arc[v][i]&&!visited[i]){//存在边且未被访问过
    10. w=i;//更新w的值
    11. DFSTraverse(w);//再次深度优先搜索w
    12. }
    13. if(count==vertexNum){//所有结点都被访问过,返回,减少执行次数
    14. return;
    15. }
    16. }
    17. }

    3.2 邻接表

    1. template <class T>
    2. void ALGraph::DFSTraverse(int v){
    3. int w,i=0,count=0;
    4. bool visited[vertexNum]=false;
    5. struct ArcNode *p=adjList[v].firstEdge;
    6. cout<//访问节点v
    7. visited[v]=true;//标志数组置为true
    8. ++count;
    9. if(count==vertexNum){
    10. return;
    11. }
    12. while(p){
    13. if(!visited[p->adjvex]){
    14. w=p->adjvex;
    15. DFSTraverse(w);
    16. }
    17. else{
    18. p=p->next;
    19. }
    20. }
    21. }

  • 相关阅读:
    最近很火的国产接口神器Apipost体验
    js内置对象Date
    31C++编程提高篇----2、类模板原理
    Java基础之运算符
    数据结构之线性表中的双向循环链表【详解】
    Redis字符串占用偏高
    JAVA动漫周边产品销售管理系统计算机毕业设计Mybatis+系统+数据库+调试部署
    【每日一题】最大矩形
    MySQL基础篇【第六篇】| 存储引擎、事务、索引、视图、DBA命令、数据库设计三范式
    《蛤蟆先生去看心里医生》阅读笔记
  • 原文地址:https://blog.csdn.net/Hsianus/article/details/134484711