河北联合大学二叉树遍历.docx
- 文档编号:11508168
- 上传时间:2023-03-02
- 格式:DOCX
- 页数:13
- 大小:201.65KB
河北联合大学二叉树遍历.docx
《河北联合大学二叉树遍历.docx》由会员分享,可在线阅读,更多相关《河北联合大学二叉树遍历.docx(13页珍藏版)》请在冰豆网上搜索。
河北联合大学二叉树遍历
数据结构(双语)
——项目文档报告
用递归、非递归两种方法遍历二叉树
专业:
计算机科学与技术
班级:
指导教师:
姓名:
学号:
目录
一、设计思想……………………………………………………….01
二、算法流程图…………………………………………………….02
三、源代码………………………………………………………….05
四、运行结果……………………………………………………….09
五、遇到的问题及解决…………………………………………….10
六、心得体会……………………………………………………….11
一、设计思想
本报告采用递归、非递归两种方法遍历二叉树
1:
递归遍历二叉树:
前序遍历:
先判断根节点是否为空,如果不为空则输出。
再判断根节点的左节点,如果不为空,则递归调用,直到遇到最左边的节点,接着访问最左边节点的右子树,如果不为空,接着递归调用刚才左子树的过程,直到遇到叶子节点。
如果右子树为空,则回溯到上次递归调用,重复对右子树进行遍历和输出。
中序遍历:
先判断根节点是否为空,如果不为空在判断根节点的左节点,如果不为空,则递归调用,直到遇到最左边的节点,然后输出,接着访问最左边节点的右子树,如果不为空,则重复上述对左子树的操作,直到遍历到叶子节点,如果右子树为空,则回溯到上一次递归调用,从而访问上一次节点的右子树,重复以上操作。
后序遍历:
先判断根节点是否为空,如果不为空在判断根节点的左节点,如果不为空,则递归调用,直到遇到最左边的节点,然后访问最左节点的右节点,再接着访问右节点的左子树的最右节点并输出,重复执行上述操作,直到遍历完整个二叉树。
2:
非递归遍历二叉树
前序遍历:
首先建立一个栈用来存放输入的二叉树的数值,当输入的数值不为空时,将数值存入栈中(此节点为根节点),然后访问当前节点的左节点,如果不为空,则将当前节点继续压入到栈中,以此类推,当节点的左节点为空时,栈顶指针减一,继而访问节点的右节点,如果不为空,则将当前节点压入栈中,以此类推,当节点的右节点为空时,栈顶指针减一,在这样的过程中,依次遍历了根节点的左子树和右子树,从而完成了整个二叉树的遍历。
中序遍历:
中序遍历和先序遍历差不多,只是当遍历到左节点的时候输出节点的值。
后序遍历:
依然定义一个栈,但此时要对每个节点进行两次输入和输出,当第二次输出这个节点的时候,输出这个节点的值,其中定义一个量flag来定义,当flag为1的时候,表示第一次入栈,当flag为2时,表示第二次出栈,此时输出当前节点的值。
二、算法流程图
图6非递归算法—后序遍历
三、源代码
下面给出的是用递归和非递归实现前中后遍历二叉树的算法实现的程序的源代码:
#include
#include
#defineMAXSIZE100
typedefstructBTree{
chardata;
structBTree*PLeft;
structBTree*PRight;
}BTree,*PBTree;
typedefstructBTreeFlag{
PBTreebtree;
intflag;
}BTreeFlag,*PBTreeFlag;
voidCreateBT(PBTree*b){
charch;
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));
}
}
}
voidPreTraverseBT(PBTreeb){
if(b){
printf("%2c",b->data);
PreTraverseBT(b->PLeft);
PreTraverseBT(b->PRight);
}
else{
return;
}
}
voidPreTraverseBT2(PBTreeb){
PBTreestack[MAXSIZE];
inttop;
PBTreep;
p=b;
top=0;
while(p!
=NULL||top>0){
while(p!
=NULL){
printf("%2c",p->data);
stack[top++]=p;
p=p->PLeft;
}
if(top>0){
p=stack[--top];
p=p->PRight;
}
}
}
voidInTraverseBT(PBTreeb){
if(b){
InTraverseBT(b->PLeft);
printf("%2c",b->data);
InTraverseBT(b->PRight);
}
else{
return;
}
}
voidInTraverseBT2(PBTreeb){
PBTreestack[MAXSIZE];
inttop;
PBTreep;
top=0;
p=b;
while(p!
=NULL||top>0){
while(p!
=NULL){
stack[top++]=p;
p=p->PLeft;
}
if(top>0){
p=stack[--top];
printf("%2c",p->data);
p=p->PRight;
}
}
}
voidPoTraverseBT(PBTreeb){
if(b){
PoTraverseBT(b->PLeft);
PoTraverseBT(b->PRight);
printf("%2c",b->data);
}
else{
return;
}
}
voidPoTraverseBT2(PBTreeb){
BTreeFlagstack[MAXSIZE];
inttop,sign;
PBTreep;
top=-1;
p=b;
while(p!
=NULL||top!
=-1){//nodeinputstackfirstly
if(p!
=NULL){
top++;
stack[top].btree=p;
p=p->PLeft;
stack[top].flag=1;
}
else{
p=stack[top].btree;
sign=stack[top].flag;
top--;
if(1==sign){//nodeinputstackfirstly
top++;
stack[top].btree=p;
stack[top].flag=2;//nodeoutputstacksecondly
p=p->PRight;
}
else{
printf("%2c",p->data);
p=NULL;
}
}
}
}
voidInitBTree(PBTreeb){
b=NULL;
}
voidInitBTree(PBTreeb);
voidPreTraverseBT(PBTreeb);
voidPreTraverseBT2(PBTreeb);
voidInTraverseBT(PBTreeb);
voidInTraverseBT2(PBTreeb);
voidPoTraverseBT(PBTreeb);
voidPoTraverseBT(PBTreeb);
voidCreateBT(PBTree*b);
voidmain(){
PBTreem;
InitBTree(m);
printf("pleaseinputchar!
\n");
CreateBT(&m);
printf("recursionpreordertarverseis:
\n");
PreTraverseBT(m);
printf("\n");
printf("unrecursionpreordertarverseis:
\n");
PreTraverseBT2(m);
printf("\n");
printf("recursioninordertarverseis:
\n");
InTraverseBT(m);
printf("\n");
printf("unrecursioninordertarverseis\n");
InTraverseBT2(m);
printf("\n");
printf("recursionpostordertarverseis:
\n");
PoTraverseBT(m);
printf("\n");
printf("unrecursionpostordertarverseis:
\n");
PoTraverseBT(m);
printf("\n");
}
四、运行结果
注:
前序创建二叉树,‘&’代表输入字符结束标志
图7程序运行结果图
五、遇到的问题及解决
这部分我主要遇到了如下两个问题,其内容与解决方法如下所列:
●在创建二叉树的时候,不知道如何结束当前的输入。
每次都会进入到死循环当中。
解决方法:
经过一段时间的思考,在函数中加入了一个标识符来识别是否输入结束。
●如何实现非递归的后序遍历,问题如图8
图8程序运行结出现的问题
解决方法:
由于非递归的后序遍历和非递归前中序遍历不一样,因此经过一段时间的考虑,可以通过对节点两次入栈和两次出栈来实现,当节点第二次出栈时,输出节点的内容,因此增加一个标志量来表示节点是第几次入栈和出栈,从而实现了非递归后序遍历。
六、心得体会
其实总体来说这次的实验比上次的那个表达式计算的实验简单一些,代码少一些,但是总觉得理解上还是有一点不到位,尤其递归的算法总是感觉理解的不是非常透彻,但是经过老师细致耐心的讲解以及自己的学习,总体上来说学到了不少知识,对二叉树有了进一步的体会,原来只是在书本上学习理论知识,如今真正上机做实验才发现还有好多感到困难的地方,由此可得,只有理论知识与实践相互结合,才能更好的掌握所学习的知识,因此,在以后的学习中,我会更加注重实践的重要性,争取做一个有用的人。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 河北 联合 大学 二叉 遍历