#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;
}
}
温馨提示:内容为网友见解,仅供参考