二叉树先序遍历的非递归算法讨论.docxVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
集美大学学报(自然科学版)JournaI of 集美大学学报(自然科学版) JournaI of Jimei Universit(y NaturaI Science) 第 6 卷 第 1 期 2001 年 3 月 VoI . 6 No . 1 Mar . 2001 [文章编号]1007 - 740(5 2001)01 - 0069 - 03 二叉树先序遍历的非递归算法讨论 王家聚,汤 岩 (集美大学信息科学系,福建 厦门 361021) [摘要]在传统的二叉树递归算法的基础上,讨论了两种非递归算法 . 一种是较常见的算 法,但这种算法有重复的操作,因而笔者做了修改,形成了第二种算法,并在时间复杂度和空 间复杂度方面对这两种算法的优劣进行了探讨 . [关键词]二叉树;先序遍历;非递归算法;栈 [中图分类号]TP 311 ! 2 [文献标识码]A 引言 二叉树是一种常见的存储形式,在高级语言程序设计中经常使用,遍历算法是树和二叉 树的基础,熟悉遍历算法对于初学者掌握计算机编程技巧是必须的,一般来说,由于二叉树 的特殊性,递归的算法是最普遍的,但由于递归算法对于初学者在理解上有一定的困难,笔 者经过不断的探索总结出了如下两种非递归算法(这里仅以先序遍历为例),希望通过本文 的介绍,能够使初学者开拓思路,进一步加深对二叉树访问的理解 . 设二叉树数据结构如下(用 C 语言描述) struct binary {int score; struct binary!Ieft,!right;} ! 算法 A 此种算法是常用算法,与参考文献[1]中介绍的中序遍历相似,是对中序遍历算法的 改进得到的 . 由于先序遍历是先根结点,后左子树,再右子树 . 根据先序遍历递归调用执行过程中工 作栈的变化,可以得到非递归的算法,先从根结点访问开始,凡是左子树不空,则访问,后 压栈,如此循环进行直至左子树为空,再出栈,对出栈结点执行类似访问根结点同样的操 作,此种操作反复执行,直至栈为空,算法结束. 具体算法如下:从根结点开始, 1)若 p 不为空,则访问该结点 p,否则出栈,即令 p = [s top],后转至 4); [收稿日期]1999 - 12 - 02 [作者简介]王家聚(1972 - ),男,助教,从事计算机专业研究 . · 70 ·集美大学学报( · 70 · 集美大学学报(自然科学版) 第 6 卷 2)把 p 压入栈; 3)p = p - left,后转至 l); 4)p = p - right; 5)重复 l)—4),直至栈为空且 p 为空为止 . 从时间上看,由于遍历二叉树的过程中,每个结 点执行的基本操作次数为 3,故对于有 ! 个结点的二 叉树而言,总的基本操作执行次数为 3 !,即时间复 杂度为 0( !). 从空间上看,具体所需栈的空间由树的形状决 定 . 由于不知道树的确切形状,故仅选择三种特殊情 况,对于完全二叉树而言,所需空间为[log2 ! ] + l;若二叉树各结点均无左孩子,即一“向右”的线 性链表,其所需空间为 l,此为最佳情况;若二叉树 各结点无右孩子,即一“向左”的线性链表,其所需 空间为 !,此为最差情况 . (对于上面的算法 A,如 流程图 l 所示). 从上面的算法可以看到,该算法存在一定的不 足:对某一子树的根结点已经做了访问,就没有必要 再对根结点压栈了 . 算法 B 由于对某一二叉子树的根结点的左子树访问后, 应该去访问其右子树,所以在压栈时,就可以直接把 该二叉子树的右子树压入,这样在出栈时,就可以直 接访问出栈结点,而没有必要再转向其右子树了 . 具体的算法如下:从根结点开始 l)访问该结点 p; 2)若 p 的右孩子不为空,把 p 的右孩子压入栈; 3)p = p - left; 4)如果 p 不为空,则重复执行 l)—3),否则 出栈,即令 p = [S top]; 5)重复执行上面 l)—4)步骤,直至栈为空为 止 . 该算法(如流程图 2 所示)同算法 A 相似,其 时间复杂度为 0( ! ),但是由于访问树时,没有压某 子树的根结点,而仅压了该子树非空的右结点,因而 约有一半左右结点的基本操作次数比算法 A 要少 . ! 第 l 期王家聚等:二叉树先 第 l 期 王家聚等:二叉树先序遍历的非递归算法讨论 · 7l · 从空间上看,具体所需栈的空间由树的形状决定 . 由于不知道树的确切形状,故这里仅 选择三种特殊情况,对于完全二叉树而言,所需空间为[log2 !]- l ;若二叉树各结点均无右 孩子,即一“向左”的线性链表,其所需栈空间为 O,此为最佳情况;若二叉树各结点均无 右孩子,即一“向右”的线性链表,其所需空间为 l . 对各种形状的树进行考察(由于篇幅 限制,

文档评论(0)

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

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

1亿VIP精品文档

相关文档