欢迎来到天天文库
浏览记录
ID:59425737
大小:511.50 KB
页数:20页
时间:2020-05-25
《数据结构_二叉树遍历实现.doc》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、数据结构实验课程名称数据结构实验题目名称二叉树的遍历实现学生学院应用数学学院专业班级信息计算1班学号学生姓名陈辉腾指导教师刘志煌2016年6月3日二叉树遍历实现14信计1班—陈辉腾—实验目的:实现二叉树的基本遍历(先序,中序和后序),通过本实验可以加深对二叉树、对递归、对堆栈,对指针的了解,以及对算法的比较和代码规范化的学习。(详细思路写在程序注释里面)首先先序构造一颗树:代码实现及思路如下:构造如下一棵树,代码运行结果如下:构造的树:构造了一颗二叉树,然后就对其进行各种遍历操作。先对其递归遍历实现:中序和后序和先序是同样的道理:运行结果如下:
2、接着对其非递归递归遍历实现:非递归遍历要用到栈,自己有写栈的各种操作。另外,我发现可以用C++库里面人家写好的,include进来就可以直接调用,以下代码有些是用自己写的栈,有些是用C++库里面的(感觉别人写的很好用,比如调试的时候查看栈内元素就比自己写的简单明了)。思路都写在代码的注释里面面,个人觉得这样好看些,截图放入word文档就省去排版了,更方便理解。先序非递归:先序非递归运行结果:中序非递归1:(中序非递归写了两种算法,都是实现书本上的。)中序非递归1运行结果:中序非递归2:中序非递归2运行结果:后序非递归也写了两种算法,一种是用标识访
3、问次数来确定右子树是否被访问的,访问次数标识变量定义结构体里面。另一种就是经典的双栈法。后序非递归1:后序非递归1运行结果:后序非递归2(双栈):后序非递归2(双栈)运行结果:总结:二叉树的本质是递归定义的二叉链表,对树的操作往往离不开递归,递归形式上看起来简单明了,调用起来却是层层嵌套,而且递归调用要保存很多信息,这些信息也应该是用栈来保存的,另外,递归调用会占用较多的CPU资源,效率不高。于是,我们考虑使用非递归的形式来对树进行操作,而非递归的算法却不太好理解,可能对于我来说不确定的因素太多了吧,要自己想还真想不出来。一开始,算法也看不太懂,
4、特别是后序非递归比较难,本身对c语言,对指针就不是特别理解,于是只能跟着程序来调试,并参考别人写的,慢慢的才理解。个人觉得后序非递归算法用双栈法比较高大上,因为不仅充分运用数据结构的栈,还能和先序非递归进行对比,简直是经典算法。另外,做实验的时候也遇到了许多困难,感觉对指针怕怕的,还好后来经过同学间的讨论,以及丰富的网上资源把困难摆平了。而看非递归算法也是有一种好像自己所有精力都会耗尽在里面,而自己对算法本质的理解还是不透彻的感觉。总的来说,做完这个实验,也感觉自己在算法方面,编码方面有一定的收获。附录:(代码)头文件:#include"stdl
5、ib.h"#defineTRUE1#defineFALSE0#defineOK1#defineERROR-1#defineOVERFLOW-2#defineSTACK_INIT_SIZE100#defineSTACK_INCREMENT10typedefintStatus;typedefcharElemType;typedefstructBiTNode{ElemTypedata;structBiTNode*lchild,*rchild;//左右孩子指针intvisitCount;//访问次数(后序遍历会用到)}BiTNode,*BiTree;ty
6、pedefstruct{BiTNode*base;BiTNode*top;intstacksize;}SqStack;Statusvisit(ElemTypeelem){printf("%c",elem);returnOK;}StatusInitStack(SqStack&S){S.base=(BiTNode*)malloc(STACK_INIT_SIZE*sizeof(BiTNode));if(!S.base)exit(OVERFLOW);S.top=S.base;S.stacksize=STACK_INIT_SIZE;returnOK;}St
7、atusPush(SqStack&S,BiTNode*p){if(S.top-S.base>=STACK_INIT_SIZE){S.base=(BiTNode*)realloc(S.base,(S.stacksize+STACK_INCREMENT)*sizeof(BiTNode));if(!S.base)exit(OVERFLOW);S.top=S.base+S.stacksize;S.stacksize+=STACK_INCREMENT;}*S.top=*p;S.top=S.top+1;returnOK;}StatusPop(SqStack&
8、S,BiTNode*&p){if(S.base==S.top)returnERROR;S.top=S.top-1;p=S.top;ret
此文档下载收益归作者所有