基于栈的非递归深度优先遍历算法设计与实现.docVIP

基于栈的非递归深度优先遍历算法设计与实现.doc

  1. 1、本文档共6页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
基于栈的非递归深度优先遍历算法设计与实现.doc

基于栈的非递归深度优先遍历算法设计与实现   摘要:深度优先遍历是图的一种重要遍历方法,该文主要介绍在邻接矩阵存储方式下,利用栈实现对稠密图进行深度优先非递归遍历的算法设计及实现过程。   关键词:深度优先;算法;非递归;栈   中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2014)03-0470-03   图是一种重要的数据结构,在实际生活中应用非常广泛,如计算机网络、电力网络、交通信号网路等。图可分为有向图,无向图,连通图,非联通图,稠密图,稀疏图等,该文仅以图1为例介绍无向连通稠密图的存储以及基于栈的非递归深度优先遍历算法。   1 图的存储表示   图在计算机中的物理存储方式主要有邻接矩阵和邻接表两种,其中邻接矩阵适用于稠密图,邻接表适用于稀疏图。该文例图可视为稠密图,因此图的物理存储采用邻接矩阵(二维数组adj[][])实现,下面是创建邻接矩阵adj[][]的C语言代码:   void create_matrix(int adj[V+1][V+1])   {   int E,u,v,wgt;//表示边的条数   printf(请输入边数:);   scanf(%d,E);   for(int i=1;i=E;i++)   {   printf(请输入第%d条边,i);   scanf(%d %d %d,u,v,wgt);   adj[u][v]=adj[v][u]=wgt;   }   }   图1利用create_matrix函数建立的邻接矩阵存储示意图如图2所示,我们可以发现图的邻接矩阵是对称矩阵。   2 图的深度优先遍历思想   深度优先搜索是图的重要遍历方法之一,遍历过程的实质是对每个顶点查找其邻接点的过程,类似于树的先根遍历,具体思路为:   1)从图中任一顶点v开始,当顶点v未被访问过时,做访问标记;   2)遍历v的所有邻接点:   如果邻接点u未被访问过:   ①输出顶点u;   ②做访问标记;   ③遍历u的所有邻接点;   为了保证图中的各顶点在遍历过程中访问且仅访问一次,需要为每个顶点设一个访问标记,该文利用数组visited[V]实现,数组初始值设置为0,表示所有顶点均未被访问。   3 深度优先遍历的递归算法   深度优先遍历的递归算法如下:   void DF(int v) //深度优先遍历的递归算法   {   int u;   visited[v] = ++id; //设置顶点v的访问标记   printf(%d—,v);   for (int t = 1; t = V; t++) //依次判断图中每个顶点进行如下判断   {   //如果顶点v、t之间存在边且t未被访问过,则对顶点t进行深度优先遍历;   if (adj[v][t] != 0 visited[t] == 0)   DF(t);   }   }   深度优先遍历的递归算法过程清晰、实现简单,在国内大部分数据结构的教材中均采用此种方式介绍深度优先遍历,在教学过程中由于受课时等因素的限制,教师往往也只讲授遍历的递归算法。但由于递归算法的时间效率低下,空间占用量高,在实际应用程序中人们往往采用非递归方式进行深度优先遍历。   4 深度优先的非递归算法   深度优先的非递归算法需要借助栈实现,算法的基本思路如下:   1)初始化栈;   2)对所有节点做未访问标记;   3)起始节点入栈;   4)while栈不为空时:   ①栈顶顶点v出栈;   ②如果顶点v未标记为已访问,则   打印v;   标记v为已访问;   遍历顶点v的邻接点,如果邻接点u未被标记为已访问,则u入栈;   对于一个含有V个顶点的无向连通图,深度优先遍历的非递归算法在最好的情况下(每个顶点仅有两条边相连)每个顶点仅被访问一次,时间复杂度为O(n);而在最坏的情况下(图为完全图时),搜索第i层结点时将会有n-i个结点入栈,最多在栈中存储(n-2)*(n-1)/2个结点,此时的时间复杂度与递归算法类似,为O(n2)。   深度优先遍历的非递归算法具体程序代码如下:   void dfVisit(int v)   {   SqStack s; //声明一个顺序栈s   init(s); //初始化栈   for(int i=1;i=V;i++)//依次对图中每个顶点设置访问标记   visited[i] = 0; //0表示未访问   Push(s,v); //顶点v入栈   printf(DF vertext by iteration:);   while (!isEmpty(s)) //

您可能关注的文档

文档评论(0)

lmother_lt + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档