最新图的遍历深度优先遍历和广度优先遍历ppt课件.ppt
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《最新图的遍历深度优先遍历和广度优先遍历ppt课件.ppt》由会员分享,可在线阅读,更多相关《最新图的遍历深度优先遍历和广度优先遍历ppt课件.ppt(45页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、图的遍历深度优先遍历和广图的遍历深度优先遍历和广度优先遍历度优先遍历20、图的遍历深度优先遍历和广度、图的遍历深度优先遍历和广度优先遍历优先遍历 掌握图的深度优先和广度优先遍历掌握图的深度优先和广度优先遍历的性质和方法,以及基于邻接矩阵和的性质和方法,以及基于邻接矩阵和邻接表存储结构的递归和非递归的算邻接表存储结构的递归和非递归的算法实现法实现 例如,对图例如,对图 20 1给出的有向图与无向图,一些遍给出的有向图与无向图,一些遍历结果(结点访问次序)为:历结果(结点访问次序)为: 左图:从左图:从1出发:出发:1,2,4,5;或;或1,5,2,4 从从2出发:出发:2,1,5,4;或;或2,
2、4,1,5 右图:从右图:从a出发:出发:a,b,c,d;或;或a,b,d,c; 1254abcd图图20 1一个有向图(左)和无向图一个有向图(左)和无向图 1. 一般算法 下面考虑深度优先遍历的递归实现的一般方法(存储下面考虑深度优先遍历的递归实现的一般方法(存储结构无关)。结构无关)。 图的深度优先遍历与二叉树的前序遍历相似。不同之图的深度优先遍历与二叉树的前序遍历相似。不同之处有:二叉树每个结点至多有两个可达邻接点处有:二叉树每个结点至多有两个可达邻接点(左右儿子),而图的可达邻接点数目不定;(左右儿子),而图的可达邻接点数目不定; 对二叉树,沿可达邻接点搜索时不会发生回绕,对二叉树,
3、沿可达邻接点搜索时不会发生回绕,但对图,若不加特别控制,就有可能回绕。但对图,若不加特别控制,就有可能回绕。 下面是图的深度优先遍历递归算法的一般性描述。下面是图的深度优先遍历递归算法的一般性描述。如果要另设一个数组作为访问标志,则该数组要在如果要另设一个数组作为访问标志,则该数组要在递归过程(函数)之外初始化为递归过程(函数)之外初始化为“未访问未访问”。 (二)递归实现方法(二)递归实现方法long DFS(图图g,结点,结点v0) /图深度优先遍历递归算法。从结点图深度优先遍历递归算法。从结点v0出发,深度优出发,深度优先遍历图先遍历图g,返回访问到的结点总数,返回访问到的结点总数 in
4、t nNodes; /寄存访问到的结点数目寄存访问到的结点数目 访问访问v0; 为为v0置已访问标志置已访问标志; nNodes=1; 求出求出v0的第的第1个可达邻接点个可达邻接点v; while (v存在存在) if (v未被访问过未被访问过) nNodes=nNodes+DFS(g,v); 求出求出v0的下个可达邻接点的下个可达邻接点v; return nNodes; 12541 1 2 1 3 0 4 1 5 1 有向图访问标识数组访问标识数组visited1245输出数组输出数组resu例如从例如从1点深度优先遍历,先把点深度优先遍历,先把1设置访问标志,并置入输出数组设置访问标志,
5、并置入输出数组resu,然后从邻接,然后从邻接矩阵的第一行,扫描各列,找到最近的邻接点矩阵的第一行,扫描各列,找到最近的邻接点2,将其设置访问标志,并进入输出数,将其设置访问标志,并进入输出数组,接着从邻接矩阵的组,接着从邻接矩阵的2行扫描,找到第一个构成边的点是行扫描,找到第一个构成边的点是1,检查访问标识数组,检查访问标识数组,发现发现1已经访问过,跳过,找第二个构成边已经访问过,跳过,找第二个构成边 的点的点4,设置访问标识,进入输出数组,设置访问标识,进入输出数组,再从邻接矩阵的第再从邻接矩阵的第4行扫描,寻找构成边的点,除行扫描,寻找构成边的点,除1外在无其他点,返回外在无其他点,返
6、回2行,继续寻行,继续寻找,也无新点,返回找,也无新点,返回1,找到,找到5,将,将5置访问标志,进入输出数组,置访问标志,进入输出数组,1行再无其他新点,行再无其他新点,遍历结束,返回遍历元素个数为遍历结束,返回遍历元素个数为4 。 2 2邻接矩阵实现邻接矩阵实现 这里我们为了突出主题、简化问题,假定图是用一般的邻这里我们为了突出主题、简化问题,假定图是用一般的邻接矩阵存储,邻接矩阵用简单的二维数组表示(静态),用接矩阵存储,邻接矩阵用简单的二维数组表示(静态),用0和和1分别表示无边和有边。图结点用自然数编号。分别表示无边和有边。图结点用自然数编号。 long DFS1(int gCNST
7、_NumNodes, long n, long v0, char *visited,long *resu,long &top ) /深度优先遍历图(递归)。图深度优先遍历图(递归)。图g为邻接矩阵,结点编号为为邻接矩阵,结点编号为 0n. 返回实际遍历到的结点数目返回实际遍历到的结点数目 /visited是访问标志数组,调用本函数前,应为其分配空间是访问标志数组,调用本函数前,应为其分配空间并初始化为全并初始化为全0(未访问未访问) /resu为一维数组,用于存放所遍历到的结点的编号,调为一维数组,用于存放所遍历到的结点的编号,调用本函数前,应为其分配空间用本函数前,应为其分配空间 long
8、nNodes, i; nNodes=1; resutop+=v0; /将访问到的结点依次存于将访问到的结点依次存于resu visitedv0=1; /为为v0置已访问标志置已访问标志 for (i=0; in; i+) /依次从依次从v0的各个出点出发,深度优先遍历图的各个出点出发,深度优先遍历图 if (gv0i!=0) /若若是边是边 if (!visitedi) /若结点若结点i未被访问过未被访问过 nNodes = nNodes+DFS1(g, n, i, visited,resu); /从从i起深度优先遍历图起深度优先遍历图 return nNodes; AA 如 果 不 想 让如
9、 果 不 想 让visited或或top做为函数做为函数参数,也可以在函数参数,也可以在函数中将其定义为中将其定义为static型型量。但是,这样的程量。但是,这样的程序是不可再入的,即序是不可再入的,即函数再次被调用时,函数再次被调用时,static型的量也不重新型的量也不重新初始化,造成错误!初始化,造成错误! 上面函数中的参数上面函数中的参数visited和和top实质上是中间变量,只是为实质上是中间变量,只是为了避免在递归调用时重新初始化而放在参数表中,造成使了避免在递归调用时重新初始化而放在参数表中,造成使用的不方便,为此,做个包装程序:用的不方便,为此,做个包装程序: long D
10、FS1(int gCNST_NumNodes, long n, long v0, long *resu ) char *visited; long top=0; visited = new charn; for (long i=0; in; i+) visitedi=0; long num=DFS1( g, n, v0, visited, resu, top ); delete visited; return num;125412452b51d451a1c2e3f45对应的邻接表对应的邻接表图图 20 2有向图1 1 2 1 3 0 4 1 5 1访问标识数组访问标识数组visited输出数组
11、输出数组resu地址起 终 权 信息链a1 2bb1 5c2 1dd2 4e3 5f4 1邻接表边PNodes 终点终点2作为下次的始点,作为下次的始点,由于由于1点已访问过,跳过,点已访问过,跳过,找到找到4,记标识,送输出,记标识,送输出,4有作为新的始点重复上有作为新的始点重复上述过程述过程 3邻接表深度优先遍历的实现深度优先遍历的实现 template long DFS2(TGraphNodeAL *nodes,long n,long v0, char *visited, long *resu,long &top) /深度优先遍历用邻接表表示的图。深度优先遍历用邻接表表示的图。node
12、s是邻接表的头数组,是邻接表的头数组,n为结点个数(编号为为结点个数(编号为0n)。)。 /v0为遍历的起点。返回实际遍历到的结点的数目。为遍历的起点。返回实际遍历到的结点的数目。 /visited是访问标志数组,调用本函数前,应为其分配空间并初是访问标志数组,调用本函数前,应为其分配空间并初始化为全始化为全0(未访问未访问) /resu为一维数组,用于存放所遍历到的结点的编号,调用本函为一维数组,用于存放所遍历到的结点的编号,调用本函数前,应为其分配空间数前,应为其分配空间 long nNodes, i; TGraphEdgeAL *p; nNodes=1; resutop+=v0; /将访
13、问到的结点依次存于将访问到的结点依次存于resu visitedv0=1; /置置v0为为“已访问已访问”标志标志 p = nodesv0.firstOutEdge; /求出求出v0的第一个出点的第一个出点p while (p!=NULL) if (!visitedp-endNo ) /若若p未访问,则从未访问,则从p出发深度优先遍出发深度优先遍历历 nNodes = nNodes+DFS2(nodes, n, p-endNo, visited, resu,top); p = p-next; /令令p指向指向v0的下个出点的下个出点 return nNodes; 与邻接矩阵的情况类似,也可以对
14、该程序与邻接矩阵的情况类似,也可以对该程序“包装包装”,以隐蔽,以隐蔽visited和和top。 (三三) 非递归实现方法非递归实现方法1一般方法一般方法 下面考虑深度优先遍历的非递归实现的一般方法(存储下面考虑深度优先遍历的非递归实现的一般方法(存储结构无关)。结构无关)。 图的深度优先遍历的非递归实现,仍然与二叉树的前序图的深度优先遍历的非递归实现,仍然与二叉树的前序遍历非递归实现相似。不同之处有:二叉树每个结点至遍历非递归实现相似。不同之处有:二叉树每个结点至多有两个可达邻接点(左右儿子),而图的可达邻接点数多有两个可达邻接点(左右儿子),而图的可达邻接点数目不定,因此,当结点重新出现在
15、栈顶时,不能一定出栈,目不定,因此,当结点重新出现在栈顶时,不能一定出栈,而是要根据它的各出点是否都已被访问过来决定(是则出而是要根据它的各出点是否都已被访问过来决定(是则出栈);对二叉树,沿可达邻接点搜索时不会发生回绕,栈);对二叉树,沿可达邻接点搜索时不会发生回绕,但对图,若不加特别控制,就有可能回绕。但对图,若不加特别控制,就有可能回绕。 long DFS_NR(图图g,结点,结点v0) /图深度优先遍历非递归算法。从结点图深度优先遍历非递归算法。从结点v0出发,深度优出发,深度优先遍历图先遍历图g,返回访问到的结点总数,返回访问到的结点总数 int nNodes; /寄存访问到的结点数
16、目寄存访问到的结点数目 访问访问v0; 为为v0置已访问标志置已访问标志; v0进栈进栈S; nNodes=1; 求出求出v0的第的第1个可达邻接点个可达邻接点v; 深度优先遍历非递归算法的一般性描述。深度优先遍历非递归算法的一般性描述。while (栈栈S不空不空) v = 栈栈S顶部元素;顶部元素; 求求v的下个未访问过的出点的下个未访问过的出点i; 访问访问i; 为为i置已访问标志置已访问标志; i进栈进栈S; nNodes+; if (v已无未被访问过的出点已无未被访问过的出点) 出栈;出栈; return nNodes; 上面的伪码描述与具体的数据结构无关。下面的程序分别给上面的伪码
17、描述与具体的数据结构无关。下面的程序分别给出了针对邻接矩阵与邻接表的算法模型。出了针对邻接矩阵与邻接表的算法模型。 2邻接矩阵实现邻接矩阵实现long DFS1_NR(int gCNST_NumNodes, long n, long v0, long *resu )/深度优先遍历图深度优先遍历图(非递归)。图非递归)。图g为邻接矩阵,为邻接矩阵, 结点编号为结点编号为0n. 返回实际遍历到的结点数目返回实际遍历到的结点数目 /resu为一维数组,用于存放所遍历到的结点的为一维数组,用于存放所遍历到的结点的 编号,调用本函数前,应为其分配空间编号,调用本函数前,应为其分配空间 long nNod
18、es, i, v; long top; char *visited; long *s; visited = new charn; for (i=0; in; i+) visitedi=0; s = new longn+1; top=0; nNodes=0; resunNodes+=v0; /将访问到的结点依次存于将访问到的结点依次存于resu visitedv0=1; /为为v0置已访问标志置已访问标志 top+; stop=v0; while (top!=0) v=stop; for (i=0; in; i+) /寻找寻找v的下个未访问的邻接点的下个未访问的邻接点 if (gvi!=0) /
19、若若是边是边 if (!visitedi) /若结点若结点i未被访问过未被访问过 resunNodes+=i; /将访问到的结点依次存于将访问到的结点依次存于resu visitedi=1; /为为i置已访问标志置已访问标志 top+; stop=i; /i进栈进栈 break; if (i=n) top-; /若若v已无未访问到的出点,则将其退栈已无未访问到的出点,则将其退栈 /while return nNodes;下面给出初始结点为下面给出初始结点为1时,得进出栈的过程:时,得进出栈的过程:15224111进栈进栈 ,1出栈;出栈;2进栈,进栈,5进栈,进栈,5出栈,出栈,2出栈,出栈,
20、1进栈,进栈,4进栈,进栈,4出栈,出栈,1出栈。出栈。遍历结果为遍历结果为 1,5,2,420.320.3深度优先遍历的性质深度优先遍历的性质 深度优先遍历有许多重要而有趣的性质,深度优先遍历有许多重要而有趣的性质,利用它们可以获得有关图的更多的信息。利用它们可以获得有关图的更多的信息。我们这里作一简单介绍。我们这里作一简单介绍。(一一) 深度优先生成树与单源路径深度优先生成树与单源路径 在深度优先遍历中,如果将每次在深度优先遍历中,如果将每次“前进前进”(纵深)(纵深)路过的(将被访问的)结点和边都记录下来,就得路过的(将被访问的)结点和边都记录下来,就得到一个子图,该子图为以出发点为根的
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 最新 遍历 深度 优先 广度 ppt 课件
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内