高分悬赏求一C++程序,急急急急急急急急急急急急

要求:1. 创建二叉树类。二叉树的存储结构使用链表。
2. 提供操作:前序遍历,中序遍历,后序遍历,层次遍历,删除指定元素,计算二叉树节点数目,计算二叉树高度。
3. 对建立好的二叉树,执行上述各操作。
接受键盘录入的二叉树前序序列和中序序列(各元素各不相同),输出该二叉树的后续序列。
我的邮箱592816129@qq.com
zhangcun4444@yahoo.cn
兄弟,你只把代码发过来也行。但要附加说明,发过来后说一声。

#include<iostream.h>
#include <string.h>

const int maxsize=100;
typedef char datatype;
typedef struct node *pointer; //二叉链表类型
struct node{
datatype data;
pointer lchild, rchild;
};
typedef pointer bitree;

typedef struct{
pointer data[maxsize];
int front,rear;
}sqqueue;

pointer Q[maxsize+1]; //按层次序列建立二叉树,返回根指针
bitree level_creat(){
datatype ch;
int front,rear;
pointer root,s;
root=NULL;
front=rear=0;
while(cin>>ch,ch!='#'){
if(ch!='@'){
s=new node;
s->data=ch;
s->lchild=s->rchild=NULL;
}
else s=NULL;
rear++;
Q[rear]=s;
if(rear==1){root=s;front=1;}
else if(s&&Q[front]){
if(rear%2==0) Q[front]->lchild=s;
else Q[front]->rchild=s;}
if(rear!=1&&rear%2==1) front++;
}
return root;
}

bitree pre_creat(){ //先根建立 ok
bitree t;
char ch;
cin>>ch;
if(ch=='@') return NULL;
t=new node;
t->data=ch;
t->lchild=pre_creat();
t->rchild=pre_creat();
return t;
}

bitree in_creat(){ //中根建立
bitree t;
char ch;
cin>>ch;
if(ch=='@') return NULL;
t=new node;
t->lchild=pre_creat();
t->data=ch;
t->rchild=pre_creat();
return t;
}

bitree post_creat() { //后根建立
bitree t;
char ch;
cin>>ch;
if(ch=='@') return NULL;
t=new node;
t->lchild=pre_creat();
t->rchild=pre_creat();
t->data=ch;
return t;
}

bitree prein_creat(datatype Pre[],int ps, int pe, datatype In[],int is, int ie){ //先序和中序建立二叉树,ps、pe、is、ie分别为区间的起止节点
bitree t;
int i;
if(ps>pe) return NULL;
t=new node;
t->data=Pre[ps];
i=is;
while(In[i]!=Pre[ps]) i++;
t->lchild=prein_creat(Pre,ps+1,ps+i-is,In,is,i-1);
t->rchild=prein_creat(Pre,ps+i-is+1,pe,In,i+1,ie);
return t;
}

bitree postin_creat(datatype Post[],int ps, int pe, datatype In[],int is, int ie){ //后序和中序建立二叉树,ps、pe、is、ie分别为区间的起止节点
bitree t;
int i;
if(ps>pe) return NULL;
t=new node;
t->data=Post[pe];
i=is;
while(In[i]!=Post[pe]) i++;
t->lchild=postin_creat(Post,ps,ps+i-is-1,In,is,i-1);
t->rchild=postin_creat(Post,ps+i-is,pe-1,In,i+1,ie);
return t;
}

void preorder(bitree t){ //先根遍历
if(t==NULL) return;
cout<<t->data<<endl;
preorder(t->lchild);
preorder(t->rchild);
}

void inorder(bitree t){ //中根遍历
if(t==NULL) return;
inorder(t->lchild);
cout<<t->data<<endl;
inorder(t->rchild);
}

void postorder(bitree t){ //后根遍历
if(t==NULL) return;
postorder(t->lchild);
postorder(t->rchild);
cout<<t->data<<endl;
}

void init_sqqueue(sqqueue &Q){ //循环队列初始化
Q.front=Q.rear=-1;
}

int empty_sqqueue(sqqueue &Q){ //循环队列空判断
if(Q.rear==Q.front) return 1;
else return 0;
}

int en_sqqueue(sqqueue &Q, pointer p){ //入队
if(((Q.rear+1)%maxsize)==Q.front){
cout<<"队满,不能入队!\n"<<endl;
return 0;
}
else{
Q.rear=(Q.rear+1)%maxsize;
Q.data[Q.rear]=p;
return 1;
}

}

int de_sqqueue(sqqueue &Q, pointer &p){ //出队,返回原对头指针
if(Q.rear==Q.front){
cout<<"队空,不能出队\n";
return 0;
}
else{
Q.front=(Q.front+1)%maxsize;
p=Q.data[Q.front];
return 1;
}
}

void levelorder(bitree t){ //层次遍历
pointer p;
sqqueue Q;
if(t==NULL) return;
init_sqqueue(Q);
en_sqqueue(Q,t);
while(!empty_sqqueue(Q)){
de_sqqueue(Q,p);cout<<p->data<<endl;
if(p->rchild!=NULL) en_sqqueue(Q,p->lchild);
if(p->rchild!=NULL) en_sqqueue(Q,p->rchild);

}
/*pointer p;
sqqueue Q;
if(t==NULL) return;
init_sqqueue(&Q);
en_sqqueue(&Q,t);
while(!empty_sqqueue(&Q)){
de_sqqueue(&Q,&p); cout<<p->data<<endl; //出队,访问队头
if(p->lchild!=NULL) en_sqqueue(&Q,p->lchild);
if(p->rchild!=NULL) en_sqqueue(&Q,p->rchild);
}
*/
}

void visit(pointer p){
if(p!=NULL) cout<<p->data<<endl;
else cout<<"error"<<endl;
}

void preorder0(bitree t){ //先根遍历,非递归
pointer p,S[maxsize];
int top;
if(t==NULL) return;
top=-1;
p=t;
while(!(p==NULL&&top==-1)){
while(p!=NULL){
visit(p);
S[++top]=p->rchild;
p=p->lchild;
}
p=S[top--];
}

}

void preorder1(bitree t){ //先根遍历,非递归,根预入栈处理
pointer p,S[maxsize];
int top;
if(t==NULL) return;
top=-1;
S[++top]=t;
while(top>=0) {
p=S[top--];
while(p!=NULL){
visit(p);
S[++top]=p->rchild;
p=p->lchild;
}

}

}

void preorder2(bitree t){ //先根遍历,非递归,预入栈处理
pointer p,S[maxsize];
int top;
if(t==NULL) return;
top=-1;
S[++top]=t;
while(top>=0) {
p=S[top--];
visit(p);
if(p->rchild!=NULL) S[++top]=p->rchild;
if(p->lchild!=NULL) S[++top]=p->lchild;
}
}

void inorder0(bitree t){ //中根遍历,非递归
pointer p,S[maxsize];
int top;
if(t==NULL) return;
top=-1;
p=t;
while(!(p==NULL&&top==-1)){
while(p!=NULL){
S[++top]=p;
p=p->lchild;
}
p=S[top--];
visit(p);
p=p->rchild;
}
}

typedef struct{
pointer p;
int flag;
}stracktype;
void postorder0(bitree t){ //后根遍历、非递归
pointer p;
stracktype S[maxsize];
int top, flag;
if(t==NULL) return;
top=-1;
p=t;
while(!(p==NULL&&top==-1)){
while(p!=NULL){ //进栈
top++;
S[top].p=p;
S[top].flag=1;
p=p->lchild;
}
p=S[top].p; //退栈
flag=S[top].flag;
top--;
if(flag==1){
top++;
S[top].p=p;
S[top].flag=2;
p=p->rchild;
}
else {
visit(p);
p=NULL;
}
}
}

int numleaf=0; //numleaf为叶子数,求二叉树中的叶子节点总数
void leaf(bitree t){

if(t==NULL) return;
if(t->lchild==NULL&&t->rchild==NULL) numleaf++;
leaf(t->lchild);
leaf(t->rchild);

}

int num=0; //num为节点数,求二叉树中的节点总数 ok
void node(bitree t){
if(t==NULL) return;
num++;
node(t->lchild);
node(t->rchild);
}

int degree1=0; //degree1为二叉树中度为1的节点数,求二叉树中度为1的节点总数 ok
void node_degree1(bitree t){
if(t==NULL) return ;
if((t->lchild==NULL&&t->rchild!=NULL)||(t->lchild!=NULL&&t->rchild==NULL)) degree1++;
node_degree1(t->rchild);
node_degree1(t->lchild);

}

int degree2=0; //degree2为二叉树中度为2的节点数,求二叉树中度为2的节点总数 ok
void node_degree2(bitree t){
if(t==NULL) return ;
if(t->lchild!=NULL&&t->rchild!=NULL) degree2++;
node_degree2(t->rchild);
node_degree2(t->lchild);

}

int depth(bitree t){ //求二叉树的高度,depth为树的高度

int l,r,max;
if(t!=NULL)
{
l=depth(t->lchild);
r=depth(t->rchild);
max=l>r?l:r;
return (max+1);
}
else return(0);
}

void del_tree(bitree t){ //二叉树的删除,递归实现 ok
pointer l,r;
if(t==NULL) return; //空树
l=t->lchild; r=t->rchild;
delete t;
del_tree(l);
del_tree(r);

}

void exch_tree(bitree t){ // 交换二叉树的左右子树 ok
pointer p;
if(t==NULL) return; //空树
p=t->lchild;t->lchild=t->rchild;t->rchild=p; //交换
exch_tree (t->rchild);
exch_tree (t->lchild);

}

//层次建立,先根建立,中根建立,后根建立,先序和中序建立,后序和中序建立;先根遍历,中根遍历,后根遍历,层次遍历,非递归的先根遍历,非递归根预入栈处理的先根遍历1,非递归根预入栈处理的先根遍历2,非递归的中根遍历,非递归的后根遍历,求叶子数,求节点数,求二叉树中度为1的节点总数,求二叉树中度为2的节点总数,求二叉树的高度

void main(){
int i,a;
bitree t;
datatype Pre[maxsize],In[maxsize],Post[maxsize];
/* datatype x; */
cout<<"二叉树的操作:0、退出程序,1、层次建立,2、先根建立,3、中根建立,4、后根建立,5、先序和中序建立,6、后序和中序建立;"
<<"7、先根遍历,8、中根遍历,9、后根遍历,10、层次遍历,11、非递归的先根遍历,12、非递归根预入栈处理的先根遍历1,"
<<"13、非递归根预入栈处理的先根遍历2,14、非递归的中根遍历,15、非递归的后根遍历,16、求叶子数,17、求节点数,"
<<"18、求二叉树中度为1的节点总数,19、求二叉树中度为2的节点总数,20、求二叉树的高度,21、二叉树的销毁,22,左右子树的交换"
<<endl;

cout<<"请选择要执行的函数,输入对应的序号"<<endl;
cin>>i;
while(i!=0){
switch(i){
case 1:
t=level_creat();
break;
case 2:
t=pre_creat();
break;
case 3:
t=in_creat();
break;
case 4:
t=post_creat();
break;
case 5:
cout<<"请输入先序序列:"<<endl;
cin>>Pre;
cout<<"请输入中序序列:"<<endl;
cin>>In;
t=prein_creat(Pre,0,strlen(Pre)-1,In,0,strlen(In)-1);
break;
case 6:
cout<<"请输入后序序列:"<<endl;
cin>>Post;
cout<<"请输入中序序列:"<<endl;
cin>>In;
t=postin_creat(Post,0,strlen(Post)-1,In,0,strlen(In)-1);
break;

case 7:
preorder(t);
break;
case 8:
inorder(t);
break;
case 9:
postorder(t);
break;
case 10:
levelorder(t);
break;
case 11:
preorder0(t);
break;
case 12:
preorder1(t);
break;
case 13:
preorder2(t);
break;
case 14:
inorder0(t);
break;
case 15:
postorder0(t);
break;

case 16:
leaf(t);
cout<<"叶子节点数为:"<<numleaf<<endl;
break;
case 17:
node(t);
cout<<"节点数为:"<<num<<endl;
break;
case 18:
node_degree1(t);
cout<<"度为1的节点数为:"<<degree1<<endl;
break;
case 19:
node_degree2(t);
cout<<"度为2的节点数为:"<<degree2<<endl;
break;
case 20:
a=depth(t); cout<<"高度为:"<<a<<endl;
break;
case 21:
del_tree(t);
break;
case 22:
cout<<"交换二叉树的左右子树"<<endl;
exch_tree(t);
cout<<"交换后先跟遍历为:"<<endl;
preorder(t);
break;

}
cout<<"请选择要执行的函数,输入对应的序号"<<endl;
cin>>i;

}

}
温馨提示:内容为网友见解,仅供参考
第1个回答  2008-11-26
这个程序很大的,要把它全给你的话。 你认为你在百度上能看懂么?!~

而且编译完粘过来的没有格式。肯定很乱。

你把邮箱给我,我给你打包过去吧!~

这个作业我们刚做完,呵呵。。

我把包 给你 传过去了 …… 收到后告诉我一声本回答被提问者采纳
第2个回答  2008-11-13
哦。。这个挺不错哦。。我也下去练习练习
第3个回答  2008-11-25
以前写过,晚上回去给你发,我的邮箱xiudewu520@126.com
相似回答