课程设计: 关于二叉树操作

源代码在线查看: 二叉树操作.cpp

软件大小: 1179 K
上传用户: snowpilce
关键词: 二叉树 操作
下载地址: 免注册下载 普通下载 VIP

相关代码

				 /*课程设计题十五:.二叉树用二叉链表表示 
				
				一、 设计目的 
				1.掌握二叉树的概念和性质 
				2. 掌握任意二叉树存储结构。 
				3.掌握任意二叉树的基本操作。 
				二、设计内容和要求  
				1. 实现二叉树的建立、前序(非递归)、中序和层次遍历; 
				2. 求二叉树高度、结点数、度为1的结点数和叶子结点数; 
				3. 插入结点到指定位置、删除指定结点; 
				4. 将二叉树所有结点的左右子树交换。 
				
				
				
				源代码 */
				
				
				  
				#include  
				#include  
				#include 
				#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				{ 
				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				 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				 } 
				 if(a==2) 
				 { 
				 printf("前序遍历为:");  
				 preorder(bt);  
				 printf("\n");  
				 printf("中序遍历为:");  
				 inorderout(bt);  
				 printf("\n");  
				 printf("层次遍历为:");  
				 translevel(bt); 
				printf("\n"); 
				cout				 } 
				 if(a==3) 
				 { 
				 printf("交换后的树中序输出为:"); 
				 inorderout(swap(bt));  
				 cout				  
				 } 
				 if(a==4) 
				 { 
				 printf("请输入要插入结点的双亲及要插入的元素(如bc)-----"); 
				 char x,e;  
				 cin>>x>>e;  
				 print(insertl(bt, x, e));  
				 cout				  
				 } 
				 if(a==5) 
				 { 
				 printf("请输入要插入结点的双亲及要插入的元素(如bc)-----"); 
				 char x,e;  
				 cin>>x>>e;  
				 print(insertr(bt, x, e)); 
				 cout				  
				 } 
				 if(a==6) 
				 { 
				 printf("请输入要删除的双亲结点-----");  
				 char y;  
				 cin>>y;  
				 print(deletl(bt, y));  
				 cout				  
				 } 
				 if(a==7) 
				 { 
				 printf("请输入要删除的双亲结点-----");  
				 char y;  
				 cin>>y;  
				 print(deletr(bt, y));  
				 cout				  
				 } 
				
				 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; 
				 }  
				}  
				 
							

相关资源