//Nhap cay Read
void ReadTree(Tree *T){
     MakeNull_Tree(T);
     int n=0, i=1;
     do{
     printf(“\n\nSo nut cua cay : “);
     fflush(stdin); scanf(“%d”,&n);}while((n<1)||(n>MaxLength));
          T->MaxNode=n;
          printf(“\n\nNhap nhan nut goc : “);
          fflush(stdin); scanf(“%c”,&(*T).Label[0]);
          T->Parent[0]=-1;
          for (i=1;i<n;i++){
              printf(“\n\nNhap vao nhan cua nut %d : “,i);
              fflush(stdin); scanf(“%c”,&(*T).Label[i]);
              printf(“\n\nNhap vao cha cua nut %d : “,i);
              fflush(stdin); scanf(“%d”,&(*T).Parent[i]);
          }
}
//Do sau cua nut p
int DepthNode(Node p, Tree T) {
   if(p>=0|| p<T.MaxNode) {
      int temp = 0;
      while(p!=Root(T)) {
         p = T.Parent[p];
         temp++;
      }
      return temp;
   }
   else
      return NIL;
}
//Chieu cao cua cay
int HeightTree(Tree T) {
   int Max = NIL;
   for(int i = T.MaxNode-1; i>=0; i–)
      if(Max < DepthNode(i,T))
         Max = DepthNode(i,T);
   return Max;
}
//Duyet cac nut theo muc cua nut tang dan
void LevelOrder(Tree T) {
   for(int i = 0; i<=HeightTree(T); i++)
      for(unsigned int j = 0; j<T.MaxNode; j++)
         if(DepthNode(j,T)==i)
            printf(“%c, “,Label(j,T));
}
//Tim to tien chung gan nhat
Node NearRoot(Node p, Node q, Tree T) {
   if(p>=0 && p<T.MaxNode && q>=0 && q<T.MaxNode && !Empty_Tree(T))
   {
      if( p==Root(T)||q==Root(T))
         return 0;
      else
      {
         while(p!=NIL)
         {
            Node k = q;
            while(k!=NIL)
            {
               if( p == k)
                  return k;
               k = T.Parent[k];
            }
            p = T.Parent[p];
         }
      }
   }
   else
      return NIL;
}
//Bac cua nut
int Nb_Child_Node (Node N, Tree T){
    int kq=0;
    Node i;
    i=LeftMostChild(N,T);
    while (i!=NIL){
          kq++;
          i=RightSibling (i,T);
          }
    return kq;
}

//Bac cua cay
int Deg_Tree(Tree T) {
   int Max = NIL;    //Max = -1
   for(int i= 0; i < T.MaxNode; i++) {
      int temp = 0;
      for(int j= 0; j < T.MaxNode; j++)
         if( i!=j && T.Parent[j]==i)
            temp++;
      if(Max < temp)
         Max = temp;
   }
   return Max;
}
//So luong anh em ruot phai
int  nb_RightSibling(Node p, Tree T){
     int n=0;
     Node i=p+1;
     while (i<T.MaxNode){
           if (Parent(p,T)==Parent(i,T))
           n++;
           i++;
     }
     return n;
}