//Nhap cay tu ban phim
void ReadTree(TTree *T){
     int i, n=0;
     KeyType X;
     do{
             printf(“\nNhap vao so nut : “);
             fflush(stdin); scanf(“%d”,&n);
             }while(n==0);
     printf(“\nNhap vao nua goc : “);
     fflush(stdin); scanf(“%d”,&X);
     InsertNode(X,T);
     for (i=1;i<n;i++){
         printf(“\nNhap vao nut thu %d : “, i);
         fflush(stdin); scanf(“%d”,&X);
         InsertNode(X,T);
     }
}
//Xac dinh so nut cua cay
int nbnodes(TTree T){
    if (T){
    int n=nb_nodes(T->left)+nb_nodes(T->right);
    return n+1;
    }
 else return 0;
}
//Xac dinh so nut la
int nb_leaf(TTree T){
    if (T){
       int n=nb_leaf(T->left)+nb_leaf(T->right);
       if (isLeaf(T)) n++; return n;
       }
    else return 0;
}
//Dem so nut co 1 con
int Count1(TTree T){
if(T){
          int d=Count1(T->left)+Count1(T->right);
     if ((T->left!=NULL && T->right==NULL) || (T->left==NULL && T->right!=NULL))
             return d+1;
          else return d;
}
else
    return 0;
}
//Dem so nut co 2 con
int Count2 (TTree T){
    if (T){
           int n=Count2(T->left) + Count2(T->right);
           if (T->left!=NULL && T->right!=NULL) return n+1;
           else return n;
       }
    else return 0;
}
//Nut lon nhat trong cay
int MaxNode(TTree T) {
   if(T->right == NULL)
      return T->Key;
   else
      return MaxNode(T->right);
}
//Nut nho nhat trong cay
int MinNode(TTree T) {
   if( T->left == NULL)
      return T->Key;
   else
      return MinNode(T->left);
}
//Tim to tien chung gan nhat
int NearRoot(int p, int q, TTree T) {
   if((T->Key >=p && T->Key <= q) || (T->Key >=q && T->Key <= p))
      return T->Key;
   else
      if(T->Key < p && T->Key < q)
         return NearRoot(p,q, T->right);
      else
         return NearRoot(p,q, T->left);
}
//Tinh tong cac nut
int SumNode(TTree T) {
   if(T == NULL)
      return 0;
   else
      return (T->Key + SumNode(T->left) + SumNode(T->right));
}
//Tinh tong cac nut la
int SumLeaf(TTree T){
    if (EmptyTree(T)) return 0;
    else
         if ((T->left==NULL)&&(T->right)==NULL) return T->Key;
         else return SumLeaf(T->left)+Sumleaf(T->right);
}
(
int SumLeaf(TTree T){
    if (!EmptyTree(T)){
       int a = SumLeaf(T->left);
       int b = SumLeaf(T->right);
       if (T->left==NULL && T->right==NULL)
          return T->Key + a + b;
          return a+b;
    }
  return 0;
}
)
//Tong cac nut chan
int SumEven(TTree T){
     int S=0;
     if (EmptyTree(T)) return S;
     else
         if(T->Key%2==0){
         S=S+T->Key;
         S=S+SumEven(T->left)+SumEven(T->right);
         }
         return S;
}
//Sao chep cay
void CopyTree(TTree T, TTree P){
     if (!EmptyTree(T)){
     P->Key=T->Key;
     P->left=NULL;
     P->right=NULL;
     CopyTree(T->left,P->left);
     CopyTree(T->right,P->right);
     }
}
//Chieu cao cua cay
//(nhớ -1 trong main)
int TreeHeight(TTree T){
    if (T){
           int n1=TreeHeight(T->left);
           int n2=TreeHeight(T->right);
           return ((n1>n2)? n1:n2)+1;
       }
    else return 0;
}
//Bac thuc su
int Max(int a,int b){
    return (a>b)? a: b;
}
int Bac(TTree T){
    int n=0,kq;
    if(T!=NULL){
       if(T->left == NULL || T->right == NULL )
          n =1;
       else n=2;
       return n;
       kq = Max(Bac(T->left),Bac(T->right));
    }
    return kq;
}
//Duyet theo muc
void InMuck(int m, int k, TTree T){
     if(T){
if(m==k){
printf(“%d, “, T->Key);
return;
}
else{
m++;
InMuck(m,k,T->left);
InMuck(m,k,T->right);
}
}
}