数据结构—图的遍历

113 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第23天,点击查看活动详情

前言

昨天讲了图的基本术语和存储结构,今天继续探索图的知识。

图的遍历

我们之前讲过二叉树的遍历,对遍历想然不是十分陌生。图的遍历就是从已给的图中某一顶点出发,沿着一些边,访遍 图中所有的顶点,且使每个顶点仅被访问一次。这与二叉树的遍历很是相似了。

但是有一个问题就是图中可能存在回路,且图的任一顶点都可能与其它顶点相通, 在访问完某个顶点之后可能会沿着某些边又回到了曾经访问过的顶点。

对于这个问题我们想出的解决方法就是——设置一个辅助数组visited[n],用来标记每个被访 问过的顶点。它的初始状态为0,在图的遍历过程中,一旦某一个顶点i被访问,就立即改visited[i]为1,防止它被多次访问。

与二叉树一样,图也有深度优先搜索和广度优先搜索两种方式。

深度优先搜索

遍历步骤:从图中某个顶点v出发,访问此顶点,然后依次从v的未被访问 的邻接点出发深度优先遍历图,直至图中所有和v有路径相通的顶点都被 访问到;若此时图中尚有顶点未被访问,则另选图中一个未被访问的顶点 作起始点,重复上述过程,直至图中所有顶点都被访问到为止。

那么计算机如何实现DFS呢,相信学过二叉树遍历的人会想到使用递归算法!

DES(A, n, v){  //AI[n][n]为邻接矩阵,v为起始顶点(编号)
    visit(v)  //访问(例如打印)顶点v
    visited[v]=1;  //访问后立即修改辅助数组标志
    for(j=1; j<=n; j++) //从v所在行从左到右搜索邻接点
        if (A[v, j] && !visited[j]) DFS(A, n, j);
    return;
}

广度优先搜索

基本思想:仿照树的层次遍历过程

计算机通过使用队列的方式实现BFS。