系列文章目录
《数据结构–图的广度优先遍历》
一、图的深度优先遍历
1.1 算法思想
与树的先根遍历相比较:
图的深度优先遍历同意需要一个访问标记数组visited[]
相关函数接口:
1.2 代码实现
//图的深度优先遍历
void DFS(Graph G,int v){ //从顶点v出发,深度优先遍历图G
visit(v); //访问初始顶点v
visited[v]=true; //对v做已访问标记
//w是v的第一个邻接点
for(w=FirstAdjVertex(G,v);w!=-1;w=NextAdjVertex(G,v,w)) {
if(!visited[w]){ //w为v尚未访问过的邻接顶点
DFS(G,w);
}
}
}
与广度优先遍历一样,也会存在非连通图的情况:
如果是非连通图,则无法遍历完所有结点
算法改进:
//完整的深度优先遍历算法
void DFSTraverse(Graph G){ //对图G进行深度优先遍历
for(int i=0;i<G.vexnum;i++){
visited[i]=false;
}
for(int i=0;i<G.vexnum;i++){
if(!visited[i])
DFS(G,i);
}
}
1.3 复杂度分析
时间复杂度:
1、访问顶点
2、找各条边
邻接矩阵存储的图:
邻接表存储的图:
1.4 深度优先生成树
根据深度优先遍历序列来画出来的树:
深度优先生成树不唯一