树(中序,前序,顺序,静态,传地址)
一、题目
以字母为元素,按中序(后根)顺序存储元素,按前序(先根)顺序存储元素的下标,实现树的基本操作:输出、输入、求树深、求叶子数、前序、中序、层序。
要求:①对于需要回传的参数,把实参的地址传给形传;②能在TC2环境下执行。
二、概要设计
1.存储结构
中序 前序
n d[0] … d[n-1] … a[0] … a[n-1] …
结点数 元素 … 元素 … 下标 … 下标 …
typedef struct{
int n;/*结点数*/
DataType d[MAX];/*中序*/
int a[MAX];/*前序*/
}BiTree;
2.基本操作
⑴void Puts(BiTree T)——按广义表形式输出二叉树。
⑵void Gets(BiTree *T,char **s)——由广义表形式串创建树。
⑶void Depth(BiTree T,int *i)——求树深。
⑷void Leaf(BiTree T,int *i)——求叶子数。
⑸void FPrint(BiTree T)——前序。
⑹void MPrint(BiTree T)——中序。
⑺void LePrint(BiTree T)——层序。
程序如下:
/*预处理*/
#include <stdio.h>
#include <iostream.h>
#include <stdlib.h>
typedef char DataType;
/*存储结构*/
typedef struct{
int n;/*结点数*/
DataType d[MAX];/*中序*/
int a[MAX];/*前序*/
}BiTree;
/*基本操作*/
void Output(BiTree T){/*按广义表形式输出二叉树*/
cout<<"(";
if(T){
cout<<T->d;
if(T->l||T->r)cout<<",";
if(T->l)Output(T->l);
if(T->r){cout<<",";Output(T->r);}
}
cout<<")";
}
char Create(Bitree &T,char *s){/*由广义表形式串s创建树T*/
if(*s!='('||!*++s||*s=='('||*s==',')
printf("\n非法字符串!"),getch(),exit(1);
if(*s==')'){T=0;return s;}
T=new CSTNode;
if(!T)printf("\n内存不足!"),getch(),exit(1);
T->d=*s; T->s=0;
BiTree p=T;
while(*++s==',')s=Create(p->s,s+1),p=p->s;/*兄弟链*/
T->c=T->s;T->s=p->s=0;/*长子为左孩子*/
if(*s!=')')printf("\n非法字符串!"),getch(),exit(1);
return s;
}
int Depth(BiTree T,int *i){/*求树深*/
int i,j;
if(!T)return 0;
i=1+Depth(T *c); j=Depth(T *s);
return(i>j?i:j);
}
int Leaf(BiTree T,int *i){/*求叶子数*/
if(!T)return 0;
if(!T *c)return 1+Leaf(T->s);
return Leaf(T *c)+Leaf(T *s);
}
void FPrint(BiTree T){/*按先序输出各结点的值*/
if(!T)return;/*空树*/
cout<<T *d<<'\t';/*输出结点的值*/
FPrint(T *l);/*先序遍历左子树*/
FPrint(T *r);/*先序遍历右子树*/
}
void MPrint(BiTree T){/*按中序输出中各结点的值*/
if(!T)return;/*空树*/
MPrint(T *l);/*中序遍历左子树*/
cout<<T *d<<'\t';/*输出结点的值*/
MPrint(T *r);/*中序遍历右子树*/
}
void LePrint(BiTree T){/*按层序输出各结点的值*/
int d=Depth(T);/*树深*/
for(int i=1;i<=d;i++)Level(T,i);/*逐层输出*/
}
/*主函数*/
void main(){
BiTree T=0,T1=0;
char *s="(a,(b,(d,,(g))),(c,(e),(f,(h))))";
cout<<"\nT="; Output(T);
cout<<"\n\n按广义表形式串"<<s<<"创建二叉树创建二叉树T:";
cout<<"\nT="; Output(T);
cout<<"\t树深为"<<Depth(T)<<",叶子数为"<<Leaf(T);
cout<<"\nT1="; Output(T1);
cout<<"\t树深为"<<Depth(T1)<<",叶子数为"<<Leaf(T1);
cout<<"\nT1="; Output(T1);
cout<<"\t树深为"<<Depth(T1)<<",叶子数为"<<Leaf(T1);
cout<<"\n\nT的先序遍历为:"; FPrint(T);
cout<<"\nT的中序遍历为:"; MPrint(T);
cout<<"\nT的层序遍历为:"; LePrint(T);
getch();
}
请帮我修改一下,我实在是没办法了