二叉树 操作

#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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值