标签:
41 蛤蟆的数据结构笔记之四十一图的遍历之深度优先
本篇名言:“对于我来说 , 生命的意义在于设身处地替人着想 , 忧他人之忧 , 乐他人之乐。 -- 爱因斯坦”
上篇我们实现了图的邻接多重表表示图,以及深度遍历和广度遍历的代码,这次我们先来看下图的深度遍历。
欢迎转载,转载请标明出处:
图遍历又称图的遍历,属于数据结构中的内容。指的是从图中的任一顶点出发,对图中的所有顶点访问一次且只访问一次。图的遍历操作和树的遍历操作功能相似。图的遍历是图的一种基本操作,图的许多其它操作都是建立在遍历操作的基础之上
由于图结构本身的复杂性,所以图的遍历操作也较复杂,主要表现在以下四个方面:
① 在图结构中,没有一个“自然”的首结点,图中任意一个顶点都可作为第一个被访问的结点。
② 在非连通图中,从一个顶点出发,只能够访问它所在的连通分量上的所有顶点,因此,还需考虑如何选取下一个出发点以访问图中其余的连通分量。
③ 在图结构中,如果有回路存在,那么一个顶点被访问之后,有可能沿回路又回到该顶点。
④ 在图结构中,一个顶点可以和其它多个顶点相连,当这样的顶点访问过后,存在如何选取下一个要访问的顶点的问题。
基本思想:首先从图中某个顶点v0出发,访问此顶点,然后依次从v0相邻的顶点出发深度优先遍历,直至图中所有与v0路径相通的顶点都被访问了;若此时尚有顶点未被访问,则从中选一个顶点作为起始点,重复上述过程,直到所有的顶点都被访问。可以看出深度优先遍历是一个递归的过程。
如下图1中的一个无向图
其深度优先遍历得到的序列为:
0->1->3->7->4->2->5->6
代码是40节代码的一部分。
共5个点1,2,3,4,5
其中1和2,1和3,链接
2和1,2和3,2和4链接
3和1,3和2,3和4链接
4和2,4和3链接。
设置标志数组原始初始化为0.
然后dfs函数。
从第V个顶点出发,递归地深度优先遍历图。
遍历过的点设置标志位1.
然后调用visitvex函数,输出顶点值。
然后每次调用nextadjvex获取下一个邻接点,然后查看是否已经输出,如果没有输出则dfs进行递归。
void dfs(amlgraph G,int v)
{
intw,p=1;
visitedvexes[v]=1;
visitvex(G,v);//输出顶点的值
for(w=firstadjvex(G,v);w>0;w=nextadjvex(G,v,w))
if(!visitedvexes[w])//对没有访问过的定点调用dfs
dfs(G,w);
}
寻找V的第一个邻接点W
如果不存在顶点则返回-1.
如果村现在,则判断是否存在邻接点。
如果存在邻接点,判断ivex是否是v,如果是则返回边的另一个点,如果不是则返回该点。
返回V的下一个邻接点(相对于W)
主要判断方法是:
每次以V结点所在的链表开始,找下一个如果下一个节点的ivex和v相等则使用ilink连接。如果下一个节点的jvex和v相等则使用jlink链接。这样找的都是和v顶点所连接的点。直到链表为空。
代码中v表示当前点进行范围遍历,w表示当前和v点相邻的点,w进行小范围遍历。
代码中先从V=2,开始(即输入遍历节点2),然后W=4,
接着递归V=4,W=3
递归 V=3,W=4
V=3,W=2,
V=3,W=1
V=1,W=3
V=1,W=2
V=4,W=2
V=2,W=3
V=2,W=1
规则的写就是:
V=2, W=4
V=4,W=3
V=3,W=4
V=3,W=2
V=3,W=1
V=1,W=3
V=1, W=2
V=4,W=2
V=2, W=3
V=2,W=1
结束。
输出点的值。
源码还是参考40节的笔记。
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:
原文地址:http://blog.csdn.net/notbaron/article/details/47009351