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

一.图的遍历

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

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

从编号小的顶点开始

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

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

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

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

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

附设访问标志数组visitedn (n为结点个数)

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

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

二.深度优先遍历

1.基本思想

1)访问顶点v;

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

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

2.伪代码

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

3.代码实现

3.1 邻接矩阵

cpp 复制代码
template<class T>
void MGraph<T>::DFSTraverse(int v){
    bool visited[vertexNum]=false;//设置标志数组
    int w,i,count=0;
    
    cout<<vertex[v]<<endl;//访问顶点v
    visited[v]=true;//标志数组置为true
    ++count;//结点访问一次,计数器加一
    
    for(i=0;i<vertexNum;i++){
        if(arc[v][i]&&!visited[i]){//存在边且未被访问过
            w=i;//更新w的值
            DFSTraverse(w);//再次深度优先搜索w
        }
        
        if(count==vertexNum){//所有结点都被访问过,返回,减少执行次数
            return;
        }
    }
    
}

3.2 邻接表

cpp 复制代码
template <class T>
void ALGraph<T>::DFSTraverse(int v){
    int w,i=0,count=0;
    bool visited[vertexNum]=false;
    struct ArcNode *p=adjList[v].firstEdge;
    
    cout<<adjList[v].vertex<<endl;//访问节点v
    visited[v]=true;//标志数组置为true
    ++count;
    
    if(count==vertexNum){
        return;
    }
    while(p){
        if(!visited[p->adjvex]){
            w=p->adjvex;
            DFSTraverse(w);
        }
        else{
            p=p->next;
        }
    }
}
相关推荐
吞下星星的少年·-·6 小时前
The 2026 ICPC Asia East Continent Online Contest (II)(构造)
数据结构·算法
Msshu12310 小时前
2~5串锂电快充优选|XSP36 Type‑C升压/升降压快充管理芯片
数据结构·随机森林·贪心算法·排序算法·线性回归·启发式算法
动词ing13 小时前
【学习笔记】数据结构栈与队列(栈先进后出+队列先进先出+括号匹配+消消乐模型)
数据结构·笔记·学习
a1879272183113 小时前
【算法】链表(二):链表上的双指针——变速、异链与定距,和一份路程账本
数据结构·算法·leetcode·链表·go·指针·环形链表
zcmodeltech14 小时前
火电厂模型能演示冷态启动和故障处理吗?——基于STM32与Modbus RTU的集控实训控制系统设计
数据结构·stm32·单片机·嵌入式硬件·能源
Doubbbbbbble云15 小时前
区间合并问题的常见算法模式与优化思路4
java·数据结构·算法
David猪大卫15 小时前
【C++修炼】哈希表的实现
数据结构·c++·笔记·学习·算法·哈希算法·散列表
linx29517 小时前
单元九 · 零基础路线图-第 7–9 周·类与 RAII
c语言·开发语言·数据结构·c++·嵌入式硬件·算法
布莱克60517 小时前
C++ 七大排序算法详解:选择、冒泡、插入、计数、堆、快速与归并排序
数据结构·c++·算法·排序算法
科学实验家18 小时前
最小生成树:Prim,kruskal
数据结构·c++·算法