实验 二叉树的递归与非递归遍历
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验七二叉树的递归与非递归遍历
[实验目的]
1.熟悉二分检索问题的线性结构表示和二分检索树表示;
2.熟悉不同存储表示下求解二分检索问题的递归算法设计;
3.通过实例转换, 掌握将递归算法转换成迭代算法的方法;
4.掌握应用递归或迭代程序设计实现分治法求解问题的抽象控制策略.
[预习要求]
1.认真阅读算法设计教材和数据结构教材内容, 熟悉不同存储表示下求解二分检索问题的原理或方法;
2.针对线性结构表示和二分检索树表示设计递归算法;
3.参考教材和课堂教学内容, 根据将递归算法转换成迭代算法的一般步骤将二分检索递归算法转换成相应的迭代算法.
[算法或程序设计参考]
递归遍历
#include
#include
typedefstruct data
{
char c;
struct data *left;
struct data *right;
}Bin,*T;
T CreatB()
{
charch;
scanf("%c",&ch);
T tree;
tree=(T)malloc(sizeof(Bin)); if(ch=='#')tree=NULL;
else
{
tree->c=ch;
tree->left=CreatB();
tree->right=CreatB();
}
return tree;
}
void PR(T tree)
{
if(tree!=NULL)
{
PR(tree->left);
PR(tree->right);
}
}
void FR(T tree)
{
if(tree!=NULL)
{
FR(tree->left);
printf("%c ",tree->c);
FR(tree->right);
}
}
void GR(T tree)
{
if(tree!=NULL)
{
GR(tree->left);
GR(tree->right);
}
}
void main()
{
T TR;
TR=(T)malloc(sizeof(Bin));
TR=CreatB();
PR(TR);
printf("\n");
FR(TR);
printf("\n");
GR(TR);
printf("\n");
}
非递归遍历
#include
#include
#define M 1000
typedef char ElemType;//树的数据元素类型
typedefstruct Tree//树的节点类型
{
ElemType data;
struct Tree *lch,*rch;
} *BiTree;
BiTreeCreatBiTree()
//建立一个二叉树
{
BiTree T;
ElemType c;
scanf("%c",&c);
if(c=='#')
T=NULL;
else
{
T=(BiTree)malloc(sizeof(struct Tree));
T->data=c;
T->lch=CreatBiTree();
T->rch=CreatBiTree();
}
return T;
}
voidPreOrderBiTree(BiTree T)
//前序非递归遍历二叉树
{
BiTreep,s[M];
p=T;
int i=0;
while(p!=NULL)
{
if(i==M)
{
printf("顺序站的空间不足");
break;
}
printf("%c",p->data);
s[i++]=p;
p=p->lch;
if(p==NULL)
{
p=s[--i];
while(p->rch==NULL&&i>0)
p=s[--i];
}
p=p->rch;
}
}
}
voidInOrderBiTree(BiTree T)
//中序非递归遍历
{
BiTreep,s[M];
p=T;
int i=0;
while(p!=NULL)
{
while(p!=NULL)
{
if(i==M)
{
printf("顺序站的空间不足");
break;
s[i++]=p;
p=p->lch;
}
p=s[--i];
while(p!=NULL)
{
printf("%c",p->data);
if(p->rch==NULL&&i>0)
{
p=s[--i];
}
else
{
p=p->rch;
break;
}
}
}
}
voidPostOrderBiTree(BiTree T)