实验13_full - 二叉树非递归遍历
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验十三二叉树非递归遍历
1. 创建一个包含数字元素的完全二叉树,使用switch函数,根据用户的输入,同时具有如下功能:
【1】初始化一个二叉树
提示:scanf("%d%d",&i,&x);//i是按满二叉树编号,节点应有的序号,x是节点的数据先建立一个新节点,再利用性质5,建立新节点与其双亲的左/右孩子的关系。
【2】前序非递归遍历,打印出各节点的数据
【3】中序非递归遍历,打印出各节点的数据
【4】后序非递归遍历,打印出各节点的数据
【5】结束程序运行
#include
#include
struct node
{
int data;
struct node *lc,*rc;
};
struct node *root;
int m=0;
main()
{
int cord;
struct node* creat();
void preorderz(struct node *t);
void inorder(struct node *t);
void postorder(struct node *t);
do
{
printf("\n 主菜单\n");
printf(" 1 建立二叉树\n");
printf(" 2 先序非递归遍历\n");
printf(" 3 中序非递归遍历\n");
printf(" 4 后序非递归遍历\n");
printf(" 5 结束程序运行\n");
printf("-----------------------------------\n");
printf("请输入您的选择(1, 2, 3, 4, 5)");
scanf("%d",&cord);
switch(cord)
{
case 1:
{
root=creat(); // 建立二叉树
printf("建立二叉树程序以执行完,\n");
printf("请返回主菜单,用遍历算法验证程序的正确性\n");
}break;
case 2:
{
preorderz(root);
}break;
case 3:
{
inorder(root);
}break;
case 4:
{
postorder(root);
}break;
case 5:
{
printf("二叉树程序执行完,再见!\n");
exit(0);
}
}
}while(cord<=6);
}
struct node* creat()
{
struct node *t,*q,*s[30];
int i,j,x;
printf("i,x=");
scanf("%d%d",&i,&x);//i是按满二叉树编号,节点应有的序号,x是节点的数据 while((i!=0)&&(x!=0))
{
q=(struct node*)malloc(sizeof(struct node));
q->data=x;
q->lc=NULL; q->rc=NULL;//建立新节点q
s[i]=q;
if(i==1)
t=q; //t代表树根节点
else
{
j=i/2; //i的双亲节点的编号
if((i%2)==0)
s[j]->lc=q;
else
s[j]->rc=q;
}
printf("i,x=");
scanf("%d%d",&i,&x);
}
return(t);
}
void preorderz(struct node* p)//前序非递归算法
{
struct node *q,*s[30]; //s辅助栈
int top,bools;
q=p;top=0; //栈顶指针
bools=1; //bools=1为真值继续循环;bools=0为假时栈空,结束循环 do
{
while(q!=NULL)
{
printf("%6d",q->data); //访问节点
top++;
s[top]=q;
q=q->lc;
}
if(top==0)
bools=0;
else
{
q=s[top];
top--;
q=q->rc;
}
}while(bools);
printf("\n");
}
void inorder(struct node* p)//中序非递归遍历{
struct node *s[30],*q;
int top,bools;
q=p;top=0;
bools=1;
do
{
while(q!=NULL)
{
top++;
s[top]=q;
q=q->lc;
}
if(top==0)
bools=0;
else
{
q=s[top];
top--;
printf("%6d",q->data); //访问节点
q=q->rc;