用递归 非递归两种方法遍历二叉树设计报告.docVIP

用递归 非递归两种方法遍历二叉树设计报告.doc

  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文档。上传文档
查看更多
用递归 非递归两种方法遍历二叉树设计报告

用递归、非递归两种方法遍历二叉树 - PAGE 12 - 一、设计思想 1.?用递归算法遍历? 设计思想:主要是通过不同程序顺序,从而实现递归的顺序遍历? 前序遍历:先判断节点是否为空,如果不为空,则输出。再判断左节点是否为空,如果不为空,则递归调用,直到遍历到最左边。接着再遍历最左边的右子树,如果此时右子树不为空,则递归遍历左子树的操作,直到遍历到叶子节点。如果右子树为空,则回溯上次的递归调用,重复输出和遍历右子树的操作。? 中序遍历:?先遍历左节点是否为空,如果不为空,则递归调用,直到遍历到最左边或者叶子节点,然后输出,接着再遍历最左边的右子树,如果此时右子树不为空,则递归重复遍历左子树的操作,直到遍历到叶子节点。如果右子树为空,则回溯到上次递归调用,重复输出和遍历右子树的操作。? 后序遍历:先判断左节点是否为空,如果不为空则一直递归直到遍历到最左边,然后遍历右节点,再接着遍历到左子树的最右边,直到遍历到叶子节点。此时输出,回溯到上次递归,继续执行后面的操作,重复,直到将整个树遍历完毕。? 2.?用非递归算法遍历? 设计思想:主要是通过栈的存取,判空,从而实现树的遍历? 前序遍历:通过一个循环实现。先输出节点的数值,因为栈的特性,则需要先判断右子树是否为空,如果不为空,则将右子树压栈。然后判断左子树是否为空,如果不为空,则将左子树压栈。接着再将栈里面的子树弹出赋给给当前节点变量,重复上述操作,直到栈为空后退出循环。? 中序遍历:通过循环实现。将树一直遍历到最左端,并将中间所经过的节点保存在栈中,当遍历到最左边的时候,则弹出栈里面的子树。输出数值,将当前节点赋值为当前节点的右子树,遍历右子树,即重复上述操作,直到当前节点为空,并且栈内元素为0。? 后序遍历:通过循环和标记栈实现。将数一直遍历到最左端,并将中间的节点保存在树栈中,同时同步的添加一个标记栈。当遍历到最左边的时候,弹栈并赋值给当前栈,然后判断标记栈的数值,如果数值为0的话则代表当前树没有遍历过,遍历右子树。然后重复上面的操作,如果数值为1的话则代表此时数已经遍历过了,可以开始输出了,为了避免重复输出,将当前栈赋为空。重复循环操作,直到栈内没有元素,且当前节点为空(因为一直左的操作并没有将右子树压栈)。 开始Root=null 开始 Root=null Y N 输出数据 Root.getLTree=null Root=Tree t Root.getRTree=null N Y Y N 结束 开始 Root=Tree t Root=null Root.getLTree=null N N 输出数据 Y Root.getRTree=null 结束 Y N 开始 Root=Tree t Root=null Root.getLTree=null Root.getRTree=null Y 输出数据 结束 Y Y Y N N N 图1 递归算法-先序遍历 图2 递归算法-后序遍历 图3 递归算法-中序遍历 开始t.getRtree=null 开始 t.getRtree= null Tree t=root output t = null N Y Push t.getLtree= null Push N Y N 栈为空 t= stack.pop() Y N 结束 Y 开始 Tree t=root 压栈 t = null N Y t=current. getLtree() t= stack.Pop() output t=current. getRltree() 栈为空 N 结束 Y 开始Tree 开始 Tree t=root Push t = null N Y t=t.getLtree() 标签栈压栈 t= stack.pop() 标签栈出栈 赋值给标志位 判断栈是否已经入栈过 N Y t=t.getRTree() 标签栈压栈 出栈并赋值t Output Current=null 树栈为空且当前节点为空 N 结束 Y 三、源代码 #includestdio.h #includestdlib.h typedef char ElemType; //定义树结构 typedef struct tree { ElemType data; struct tree * lchild; struct tree * rchild; unsigned int isOut; //专为后序遍历设置的,0为不需要被输出,1为需要被输出 }TreeNode, *Tree; //定义栈结构 typedef struct stack { Tree * base; Tree * to

文档评论(0)

专注于电脑软件的下载与安装,各种疑难问题的解决,office办公软件的咨询,文档格式转换,音视频下载等等,欢迎各位咨询!

1亿VIP精品文档

相关文档