ImageVerifierCode 换一换
格式:DOCX , 页数:13 ,大小:201.65KB ,
资源ID:11508168      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/11508168.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(河北联合大学二叉树遍历.docx)为本站会员(b****7)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

河北联合大学二叉树遍历.docx

1、河北联合大学二叉树遍历数据结构(双语)项目文档报告用递归、非递归两种方法遍历二叉树专 业: 计算机科学与技术 班 级: 指导教师: 姓 名: 学 号: 目 录一、设计思想.01二、算法流程图.02三、源代码.05四、运行结果.09五、遇到的问题及解决.10六、心得体会.11一、设计思想本报告采用递归、非递归两种方法遍历二叉树1:递归遍历二叉树: 前序遍历:先判断根节点是否为空,如果不为空则输出。再判断根节点的左节点,如果不为空,则递归调用,直到遇到最左边的节点,接着访问最左边节点的右子树,如果不为空,接着递归调用刚才左子树的过程,直到遇到叶子节点。如果右子树为空,则回溯到上次递归调用,重复对右

2、子树进行遍历和输出。 中序遍历:先判断根节点是否为空,如果不为空在判断根节点的左节点,如果不为空,则递归调用,直到遇到最左边的节点,然后输出,接着访问最左边节点的右子树,如果不为空,则重复上述对左子树的操作,直到遍历到叶子节点,如果右子树为空,则回溯到上一次递归调用,从而访问上一次节点的右子树,重复以上操作。 后序遍历:先判断根节点是否为空,如果不为空在判断根节点的左节点,如果不为空,则递归调用,直到遇到最左边的节点,然后访问最左节点的右节点,再接着访问右节点的左子树的最右节点并输出,重复执行上述操作,直到遍历完整个二叉树。2:非递归遍历二叉树 前序遍历:首先建立一个栈用来存放输入的二叉树的数

3、值,当输入的数值不为空时,将数值存入栈中(此节点为根节点),然后访问当前节点的左节点,如果不为空,则将当前节点继续压入到栈中,以此类推,当节点的左节点为空时,栈顶指针减一,继而访问节点的右节点,如果不为空,则将当前节点压入栈中,以此类推,当节点的右节点为空时,栈顶指针减一,在这样的过程中,依次遍历了根节点的左子树和右子树,从而完成了整个二叉树的遍历。 中序遍历:中序遍历和先序遍历差不多,只是当遍历到左节点的时候输出节点的值。 后序遍历:依然定义一个栈,但此时要对每个节点进行两次输入和输出,当第二次输出这个节点的时候,输出这个节点的值,其中定义一个量flag来定义,当flag为1的时候,表示第一

4、次入栈,当flag为2时,表示第二次出栈,此时输出当前节点的值。二、算法流程图图6 非递归算法后序遍历三、源代码下面给出的是用递归和非递归实现前中后遍历二叉树的算法实现的程序的源代码:#include #include #define MAXSIZE 100typedef struct BTree char data; struct BTree * PLeft; struct BTree * PRight;BTree, *PBTree;typedef struct BTreeFlag PBTree btree; int flag;BTreeFlag, * PBTreeFlag;void Cre

5、ateBT(PBTree *b) char ch; scanf(%c, &ch); if(ch = #) *b = NULL; else if(ch=&) return; else *b = (PBTree)malloc(sizeof(BTree); if(!(*b) return; (*b)-data = ch; CreateBT(&(*b)-PLeft); CreateBT(&(*b)-PRight); void PreTraverseBT(PBTree b) if(b) printf(%2c,b-data); PreTraverseBT(b-PLeft); PreTraverseBT(b

6、-PRight); else return; void PreTraverseBT2(PBTree b) PBTree stackMAXSIZE; int top; PBTree p; p = b; top = 0; while(p!=NULL|top0) while(p!=NULL) printf(%2c, p-data); stacktop+ = p; p = p-PLeft; if(top0) p = stack-top; p = p-PRight; void InTraverseBT(PBTree b) if(b) InTraverseBT(b-PLeft); printf(%2c,

7、b-data); InTraverseBT(b-PRight); else return; void InTraverseBT2(PBTree b) PBTree stackMAXSIZE; int top; PBTree p; top = 0; p = b; while(p!=NULL|top0) while(p!=NULL) stacktop+ = p; p = p-PLeft; if(top0) p = stack-top; printf(%2c, p-data); p = p-PRight; void PoTraverseBT(PBTree b) if(b) PoTraverseBT(

8、b-PLeft); PoTraverseBT(b-PRight); printf(%2c, b-data); else return; void PoTraverseBT2(PBTree b) BTreeFlag stackMAXSIZE; int top,sign; PBTree p; top = -1; p = b; while(p!=NULL|top!=-1) /node input stack firstly if(p!=NULL) top+; stacktop.btree = p; p = p-PLeft; stacktop.flag = 1; else p = stacktop.b

9、tree; sign = stacktop.flag; top-; if(1=sign) /node input stack firstly top+; stacktop.btree = p; stacktop.flag = 2; /node output stack secondly p = p-PRight; else printf(%2c, p-data); p = NULL; void InitBTree(PBTree b) b = NULL;void InitBTree(PBTree b);void PreTraverseBT(PBTree b); void PreTraverseB

10、T2(PBTree b);void InTraverseBT(PBTree b);void InTraverseBT2(PBTree b);void PoTraverseBT(PBTree b);void PoTraverseBT(PBTree b);void CreateBT(PBTree *b);void main() PBTree m; InitBTree(m); printf(please input char! n); CreateBT(&m); printf(recursion preorder tarverse is: n); PreTraverseBT(m); printf(n

11、); printf(unrecursion preorder tarverse is: n); PreTraverseBT2(m); printf(n); printf(recursion inorder tarverse is: n); InTraverseBT(m); printf(n); printf(unrecursion inorder tarverse is n); InTraverseBT2(m); printf(n); printf(recursion postorder tarverse is: n); PoTraverseBT(m); printf(n); printf(u

12、nrecursion postorder tarverse is: n); PoTraverseBT(m); printf(n);四、运行结果注:前序创建二叉树,&代表输入字符结束标志图7 程序运行结果图五、遇到的问题及解决这部分我主要遇到了如下两个问题,其内容与解决方法如下所列: 在创建二叉树的时候,不知道如何结束当前的输入。每次都会进入到死循环当中。解决方法:经过一段时间的思考,在 函数中加入了一个标识符来识别是否输入结束。 如何实现非递归的后序遍历,问题如图8 图8 程序运行结出现的问题 解决方法:由于非递归的后序遍历和非递归前中序遍历不一样,因此经过一段时间的考虑,可以通过对节点两次入栈和两次出栈来实现,当节点第二次出栈时,输出节点的内容,因此增加一个标志量来表示节点是第几次入栈和出栈,从而实现了非递归后序遍历。六、心得体会 其实总体来说这次的实验比上次的那个表达式计算的实验简单一些,代码少一些,但是总觉得理解上还是有一点不到位,尤其递归的算法总是感觉理解的不是非常透彻,但是经过老师细致耐心的讲解以及自己的学习,总体上来说学到了不少知识,对二叉树有了进一步的体会,原来只是在书本上学习理论知识,如今真正上机做实验才发现还有好多感到困难的地方,由此可得,只有理论知识与实践相互结合,才能更好的掌握所学习的知识,因此,在以后的学习中,我会更加注重实践的重要性,争取做一个有用的人。

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1