图的遍历——深度优先遍历

深度优先遍历

                                    ——与树的先序遍历相似

  • 首先访问起始顶点v。
  • 接着由v出发访问v的任意一个邻接且未被访问的邻接顶点w。
  • 然后再访问与w邻接且未被访问的任意顶点y。
  • 若w没有邻接且未被访问过的顶顶点时,退回到它的上一层顶点V。
  • 重复上述过程,直到所有顶点被访问为止。
    存储结构
  • 栈(递归)+辅助标记数组
    代码实现
bool Visited[G.vexnum];//辅助数组,用于标记该结点是否被访问 
void DFSTraverse(Graph G){
    for(int i=0;i=0则是第一个邻接结点的下标 
    for(w;w>=0;w=NextNeighbor(G,v,w)){//NextNeighbor(G,v,w)返回w的下一个邻接结点 
        if(!Visited[w]){//判断邻接结点是否被访问 
            DFS(G,w);//递归 
        }
    }
}

DFS深度优先搜索性能分析

  • 空间复杂度O(|V|)——工作栈
时间复杂度 邻接矩阵 邻接表
O O(V^2) O(V+E)

深度优先生成树

  • 在深度遍历过程中,我们可以得到一棵遍历树,称为深度优先生成树。(生成森林)。
  • 邻接矩阵法的深度优先生成树唯一,邻接表法的不唯一。
    遍历与连通性问题
  • 无向图
  1. 从任意结点出发进行一次遍历(DFS或BFS),若能访问全部结点,说明该无向图是连通的。
  2. 调用遍历函数(BFS或DFS)的次数为连通分量的个数
  • 有向图
  1. 没有无向图这样的规律

你可能感兴趣的:(图的遍历——深度优先遍历)