天天看點

二叉樹 操作

#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;   

    }   

 }  

}

繼續閱讀