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

上传人:b****3 文档编号:5945698 上传时间:2023-05-09 格式:DOCX 页数:13 大小:201.65KB
下载 相关 举报
河北联合大学二叉树遍历.docx_第1页
第1页 / 共13页
河北联合大学二叉树遍历.docx_第2页
第2页 / 共13页
河北联合大学二叉树遍历.docx_第3页
第3页 / 共13页
河北联合大学二叉树遍历.docx_第4页
第4页 / 共13页
河北联合大学二叉树遍历.docx_第5页
第5页 / 共13页
河北联合大学二叉树遍历.docx_第6页
第6页 / 共13页
河北联合大学二叉树遍历.docx_第7页
第7页 / 共13页
河北联合大学二叉树遍历.docx_第8页
第8页 / 共13页
河北联合大学二叉树遍历.docx_第9页
第9页 / 共13页
河北联合大学二叉树遍历.docx_第10页
第10页 / 共13页
河北联合大学二叉树遍历.docx_第11页
第11页 / 共13页
河北联合大学二叉树遍历.docx_第12页
第12页 / 共13页
河北联合大学二叉树遍历.docx_第13页
第13页 / 共13页
亲,该文档总共13页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

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

《河北联合大学二叉树遍历.docx》由会员分享,可在线阅读,更多相关《河北联合大学二叉树遍历.docx(13页珍藏版)》请在冰点文库上搜索。

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

河北联合大学二叉树遍历

数据结构(双语)

——项目文档报告

用递归、非递归两种方法遍历二叉树

 

专业:

计算机科学与技术

班级:

指导教师:

姓名:

学号:

 

目录

一、设计思想……………………………………………………….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模板 > 商务科技

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2