判斷一棵樹是否爲二叉排序樹的兩種方法

一、使用先根遍歷,判斷大小關係是否正確:t->lchild->value<t->value<t->rchild->value
bool Judge(PBinTree pbt)
{
     PBinTreeNode   pLeft, pRight;
     bool    bLeft = false, bRight=false, bRootl=false, bRootr=false;
     if(pbt == NULL)
         return true;
     // 判斷根節點
     pLeft = pbt->left;
     pRight = pbt->right;
     if((pLeft && pLeft->data <= pbt->data)||pLeft==NULL)
     {
          bRootl = true;
     }
     if((pRight && pRight->data >= pbt->data)||pRight==NULL)
     {
          bRootr = true;
     }
     // 判斷左右子樹
     bLeft = Judge(pLeft);
     bRight = Judge(pRight);
     // 同時滿足條件才叫二叉排序樹
     return( bLeft && bRight && bRootl && bRootr);
}
二、如果二叉樹爲二叉排序樹,那麼中序遍歷該樹應該輸出有序結果,每次輸出的值應該比其前驅的值要大,否則不是二叉排序樹
  int   last=0,flag=1;    
  int   Is_BSTree(Bitree   T)//判斷二叉樹T是否二叉排序樹,是則返回1,否則返回0  
  {  
      if(T->lchild&&flag)   Is_BSTree(T->lchild);  
      if(T->data<last)   flag=0;   //與其中序前驅相比較  
      last=T->data;  
      if(T->rchild&&flag)   Is_BSTree(T->rchild);  
      return   flag;  
  }
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章