⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 二叉树操作.cpp

📁 课程设计: 关于二叉树操作
💻 CPP
字号:
 /*课程设计题十五:.二叉树用二叉链表表示 

一、 设计目的 
1.掌握二叉树的概念和性质 
2. 掌握任意二叉树存储结构。 
3.掌握任意二叉树的基本操作。 
二、设计内容和要求  
1. 实现二叉树的建立、前序(非递归)、中序和层次遍历; 
2. 求二叉树高度、结点数、度为1的结点数和叶子结点数; 
3. 插入结点到指定位置、删除指定结点; 
4. 将二叉树所有结点的左右子树交换。 



源代码 */


  
#include<iostream.h>  
#include<stdio.h>  
#include<malloc.h> 
#define MAXNODE 100  
//树的建立  
typedef struct bitnode  
{ char data;  
 struct bitnode *lchild,*rchild;  
}bitnode,*bintree;  
//二叉树的二叉链表的存储算法  
void createbintree(bintree *t)  
{ char ch;  
 cin>>ch;  
 if(ch=='0')  
 (*t)=NULL;  
 else  
 { (*t)=new bitnode;  
 (*t)->data=ch;  
 createbintree(&(*t)->lchild);  
 createbintree(&(*t)->rchild);  
 }  
} 

//9.中序遍历  
void inorderout(bintree bt)  
{  
 if(bt!= NULL){  
 inorderout(bt->lchild);  
 printf("%c ", bt->data);  
 inorderout(bt->rchild);  
}  
 return;  
}  
/* 11.按层遍历 */  
void translevel(bintree b) 
{ struct node 
{ 
bitnode *vec[MAXNODE]; 
int f,r; 
} q; 
q.f=0; 
q.r=0; 
if(b!=NULL)printf("%c ",b->data); 
q.vec[q.r]=b; 
q.r=q.r+1; 
while(q.f<q.r) 
{ 
b=q.vec[q.f]; 
q.f=q.f+1; 
if(b->lchild!=NULL) 
{ 
printf("%c ",b->lchild->data); 
q.vec[q.r]=b->lchild; 
q.r=q.r+1; 
} 
if(b->rchild!=NULL) 
{ 
printf("%c ",b->rchild->data); 
q.vec[q.r]=b->rchild; 
q.r=q.r+1;} 
} 
} 
 /* 6.输出二叉树(前序遍历) */  
void preorder(bitnode *b) 
{ 
bitnode *stack[MAXNODE],*p; 
int top; 
if(b!=NULL) 
{ 
top=1; 
stack[top]=b; 
while(top>0) 
{ 
p=stack[top]; 
top--; 
printf("%c ",p->data); 
if(p->rchild!=NULL) 
{ 
top++; 
stack[top]=p->rchild; 
} 
if(p->lchild!=NULL) 
{ 
top++; 
stack[top]=p->lchild; 
} 
} 
} 

} 

/*求树的高度 */  
int depth(bitnode *b)  
{  
 int dep1,dep2;  
 if(b==NULL) return(0);  
 else  
 {  
 dep1=depth(b->lchild);  
 dep2=depth(b->rchild);  
 if(dep1>dep2)return(dep1+1);  
 else return(dep2+1);  
 }  
}  
/*所有叶子结点数 */  
int countleaf(bintree bt)  
{ if(bt==NULL)  
 return 0;  
 if(bt->lchild==NULL&&bt->rchild==NULL)  
 return 1;  
 return (countleaf(bt->lchild)+countleaf(bt->rchild));  
  
}  
/*所有结点数 */  
int btreecount(bintree bt)  
{ if(bt==NULL)  
 return 0;  
 else return btreecount(bt->lchild)+btreecount(bt->rchild)+1;  
}  
/*求度为“1”的结点总数*/ 
int onechild(bitnode * b)/*求度为“1”的结点总数*/ 
{ 
int num1,num2; 
if(b==NULL)return(0); 
else if(b->lchild==NULL&&b->rchild!=NULL) 
return(1+onechild(b->rchild)); 
if(b->lchild!=NULL&&b->rchild==NULL) 
return(1+onechild(b->lchild)); 
else 
{ 
num1=onechild(b->lchild); 
num2=onechild(b->rchild); 
return(num1+num2); 
} 
} 
/*将结点的左右子树交换*/ 
bitnode *swap(bitnode *b)  
{  
 bitnode *t,*t1,*t2;  
 if(b==NULL) t=NULL;  
 else  
 {  
 t=(bitnode *)malloc(sizeof(bitnode));  
 t->data=b->data;  
 t1=swap(b->lchild);  
 t2=swap(b->rchild);  
 t->lchild=t2;  
 t->rchild=t1;  
}  
 return(t);  
  
}  
/*插入左子树*/ 
 
 
 
bitnode *insertl(bitnode *b,char x,char e)  
{  
 bitnode *stack[MAXNODE],*p,*s,*t;  
 s=(bitnode*)malloc(sizeof(bitnode));  
 s->data=e;  
 s->lchild=NULL;  
 s->rchild=NULL;  
 int top;  
 if(b!=NULL)  
 {  
 top=1;  
 stack[top]=b;  
 while(top>0)  
 {  
 p=stack[top];  
 top--;  
 printf("%c ",p->data);  
 if(p->data==x)t=p;  
 if(p->rchild!=NULL)  
 {  
 top++;  
 stack[top]=p->rchild;  
 }  
 if(p->lchild!=NULL)  
 {  
 top++;  
 stack[top]=p->lchild;  
 }  
 }  

 }  
 s->lchild=t->lchild;  
 s->rchild=t->rchild;  
 t->lchild=s;  
 printf("\n");  
 return(b);  
}  
void print(bitnode *b)  
{  
 if(b!=NULL)  
 {  
 printf("%c",b->data);  
 if(b->lchild!=NULL||b->rchild!=NULL)  
 {  
 printf("(");  
 print(b->lchild);  
 if(b->rchild!=NULL)printf(", ");  
 print(b->rchild);  
 printf(")");  
 }  
 }  
}  
/*插入右子树*/ 

bitnode *insertr(bitnode *b,char x,char e)  
{  
 bitnode *stack[MAXNODE],*p,*s,*t;  
 s=(bitnode*)malloc(sizeof(bitnode));  
 s->data=e;  
 s->lchild=NULL;  
 s->rchild=NULL;  
 int top;  
 if(b!=NULL)  
 {  
 top=1;  
 stack[top]=b;  
 while(top>0)  
{  
 p=stack[top];  
 top--;  
 printf("%c ",p->data);  
 if(p->data==x)t=p;  
 if(p->rchild!=NULL)  
 {  
 top++;  
 stack[top]=p->rchild;  
 }  
 if(p->lchild!=NULL)  
 {  
 top++;  
 stack[top]=p->lchild;  
 }  
}  

}  
 s->lchild=t->lchild;  
 s->rchild=t->rchild;  
 t->rchild=s;  
 printf("\n");  
 return(b);  
}  
/*删除左子树*/ 
bitnode *deletl(bitnode *b,char x)  
{  
 bitnode *stack[MAXNODE],*p,*t;  
 int top;  
 if(b!=NULL)  
 {  
 top=1;  
 stack[top]=b;  
 while(top>0)  
 {  
 p=stack[top];  
 top--;  
 printf("%c ",p->data);  
 if(p->data==x)t=p;  
 if(p->rchild!=NULL)  
 {  
 top++;  
 stack[top]=p->rchild;  
 }  
 if(p->lchild!=NULL)  
 {  
 top++;  
 stack[top]=p->lchild;  
 }  
 }  

 }  
 t->lchild=NULL;  
 printf("\n");  
 return(b);  
}  
/*删除右子树*/ 
bitnode *deletr(bitnode *b,char x)  
{  
 bitnode *stack[MAXNODE],*p,*t;  
 int top;  
 if(b!=NULL)  
 {  
 top=1;  
 stack[top]=b;  
 while(top>0)  
 {  
 p=stack[top];  
 top--;  
 printf("%c ",p->data);  
 if(p->data==x)t=p;  
 if(p->rchild!=NULL)  
 {  
 top++;  
 stack[top]=p->rchild;  
 }  
 if(p->lchild!=NULL)  
 {  
 top++;  
 stack[top]=p->lchild;  
 }  
 }  

 }  
 t->rchild=NULL;  
 printf("\n");  
 return(b);  
}  
void main()  
{  
 int a; 
 bintree bt;  
 printf("\n\n\n***************二叉树的二叉链表表示***************"); 
 cout<<endl<<endl<<endl; 
 printf("\n请按先序输入二叉树:\n"); 
 createbintree(&bt); 
 printf("请选择你要进行的操作:\n"); 
 printf("1.输出树的高度、叶子结点数、所有结点数、度为1的结点数;\n"); 
 printf("2.非递归前序遍历、中序遍历和层次遍历;\n"); 
 printf("3.交换左右子树;\n"); 
 printf("4.插入结点的左孩子;\n"); 
 printf("5.插入结点的右孩子;\n"); 
 printf("6.删除结点的左孩子;\n"); 
 printf("7.删除结点的右孩子;\n"); 
 printf("0.退出程序;\n"); 
 cin>>a; 
 for(;a!=0;) 
 { 
 if(a==1) 
 { 
 printf("树的高度为:%d",depth(bt));  
 printf("\n");  
 printf("叶子结点数为:%d",countleaf(bt));  
 printf("\n");  
 printf("所有结点数为:%d",btreecount(bt));  
 printf("\n"); 
printf("度为1的结点数为:%d",onechild(bt)); 
 printf("\n"); 
 cout<<endl<<endl<<endl<<endl; 
 } 
 if(a==2) 
 { 
 printf("前序遍历为:");  
 preorder(bt);  
 printf("\n");  
 printf("中序遍历为:");  
 inorderout(bt);  
 printf("\n");  
 printf("层次遍历为:");  
 translevel(bt); 
printf("\n"); 
cout<<endl<<endl<<endl<<endl; 
 } 
 if(a==3) 
 { 
 printf("交换后的树中序输出为:"); 
 inorderout(swap(bt));  
 cout<<endl<<endl<<endl<<endl; 
  
 } 
 if(a==4) 
 { 
 printf("请输入要插入结点的双亲及要插入的元素(如bc)-----"); 
 char x,e;  
 cin>>x>>e;  
 print(insertl(bt, x, e));  
 cout<<endl<<endl<<endl<<endl; 
  
 } 
 if(a==5) 
 { 
 printf("请输入要插入结点的双亲及要插入的元素(如bc)-----"); 
 char x,e;  
 cin>>x>>e;  
 print(insertr(bt, x, e)); 
 cout<<endl<<endl<<endl<<endl; 
  
 } 
 if(a==6) 
 { 
 printf("请输入要删除的双亲结点-----");  
 char y;  
 cin>>y;  
 print(deletl(bt, y));  
 cout<<endl<<endl<<endl<<endl; 
  
 } 
 if(a==7) 
 { 
 printf("请输入要删除的双亲结点-----");  
 char y;  
 cin>>y;  
 print(deletr(bt, y));  
 cout<<endl<<endl<<endl<<endl; 
  
 } 

 printf("请选择你要进行的操作:\n"); 
 printf("1.输出树的高度、叶子结点数、所有结点数、度为1的结点数;\n"); 
 printf("2.非递归前序遍历、中序遍历和层次遍历;\n"); 
 printf("3.交换左右子树;\n"); 
 printf("4.插入结点的左孩子;\n"); 
 printf("5.插入结点的右孩子;\n"); 
 printf("6.删除结点的左孩子;\n"); 
 printf("7.删除结点的右孩子;\n"); 
 printf("0.退出程序;\n\n\n"); 


 cin>>a; 
 }  
}  
 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -