二叉树 操作

来源:互联网 发布:在线php执行 编辑:程序博客网 时间:2024/06/06 19:36
#include <stdio.h> 
#include <malloc.h> 
#include <stdlib.h>  
#define NULL ((void *)0) 
typedef struct TNode{  
char data;  
struct TNode *lchild,*rchild; 
}TNode,*Tree;  


Tree Creat( )//按先序序列建立二叉树 
{
Tree T;  
char ch=getchar(); 
if(ch=='#')   
T=NULL; 
else{ 
  T=(TNode *)malloc(sizeof(TNode));  
  T->data=ch;  
  T->lchild=Creat(); 
T->rchild=Creat(); 
}  
printf("friday\n");
return T; 
 } 


 void First(Tree T)//先序遍历————递归
 {
  TNode *p=T;        
  if (p != NULL) {         
  printf("   %c", p->data); 
  First( p->lchild );         
  First( p->rchild );          
 
 
 } 
 void Middle(Tree T)//中序遍历——递归
 { 
  TNode *p=T;  if (p != NULL) { 
  Middle( p -> lchild );          
  printf("   %c", p -> data);      
  Middle( p-> rchild ) ;          
  }
 }  
 
 void Last(Tree T)//后序遍历——递归 
 { 
  TNode *p=T;  
  if (p != NULL) {    
Last( p -> lchild ) ;        
  Last( p -> rchild )    ;      
  printf("   %c", p -> data);      
 
 }  


 
 int Leaf(Tree T)//叶子结点个数
 {
  TNode *p=T; 
if(p != NULL)  {
if((p->lchild==NULL)&&(p->rchild==NULL)) 
return 1;  
  else   
  return (Leaf(p->lchild)+Leaf(p->rchild)); 
 
  else  return 0; 
 } 




 int Depth(Tree T)//树的深度 
 {
  TNode *p=T; 
int l,r;  
if(!p)   
return 0; 
else   { 
l=Depth(p->lchild);
r=Depth(p->rchild); 
if(l>r)    
return l+1;
else   
return r+1;  
}  
 }




 void Change(Tree T)//结点交换
 {
  TNode *p=T;  
  if(p!=NULL)  
 
p=T->lchild;  
T->lchild=T->rchild;  
T->rchild=p;  
Change(T->lchild); 
Change(T->rchild);  
}
 }






int main() { 
Tree T;  
int t,i,l,d; 
printf("\t\t\t****create****\n");  
printf("please input element # is for null"); 
T=Creat();       
printf("\t\t\t# 1.  FIRST  #\n");   
printf("\t\t\t# 2.  MIDDLE  #\n");   
printf("\t\t\t# 3.  BACK#\n");   
printf("\t\t\t# 4.  LEAF NUM #\n");  
printf("\t\t\t# 5.  depth  #\n");   
printf("\t\t\t# 6.  SWITCH #\n");    
printf("\t\t\t# 0.  QUIT   #\n");  
printf("\t\t\t~~~~~~~~~~~~~~~~\n");   
  for(i=0;;i++)  {
printf("◤choise(0-6):");  
scanf("%d",&t);  
if(t<0||t>6)  
printf("※error please input repeat \n");  
else   
{    
switch(t)  

case 1: printf("  ◎FIRST traverse:"); First(T); printf("\n"); break;    
case 2: printf("  ◎middle traverse:");Middle(T);printf("\n"); break;     
case 3: printf("  ◎BACK traverse:");Last(T);  printf("\n"); break;     
case 4: printf("  ◎LEAF NUM:");l=Leaf(T);  printf(" %d 个\n",l); break;    
case 5: printf("  ◎DEPTH:");d=Depth(T);  printf(" %d\n",d); break;     
case 6: printf("  █SWITCH█");Change(T);  printf("\n",d); break;              
case 0: printf("\t\t******BYE-BYE-BYE!******\n");return 0;                     
break;   
    }   
 }  



}
0 0