輸入一個整數數組,判斷該數組是不是某二叉搜索樹的後序遍歷的結果。如果是則輸出Yes,否則輸出No。假設輸入的數組的任意兩個數字都互不相同。

 

題目:輸入一個整數數組,判斷該數組是不是某二叉搜索樹的後序遍歷的結果。如果是則輸出Yes,否則輸出No。假設輸入的數組的任意兩個數字都互不相同。

分析:後續遍歷的最後一個數據是根結點數據,那麼這個數字必將序列分成左右兩部分,它大於左邊所有的數據,小於右邊所有的數據,其中找到這個分界點後,如果右半部分存在一個小於這個根數據的,就說明不是後續遍歷,然後用同樣的方式遞歸判斷它的左子樹、右子樹。

bool VerifySquenceOfBST(vector<int> sequence) {
        if(sequence.size()<=0)
            return false;
        
        return _VerifySquenceOfBST(sequence, 0, sequence.size()-1);

    }
    
    //判斷最後一個數據是不是將數組分成左邊都小於這個數,右邊都大於這個數
   bool  _VerifySquenceOfBST(vector<int> v, int start, int end)
   {
       if(start>=end)
           return true;
       
       int root=v[end];
       
       int i=start;
       //找到第一個比根結點大的分界點
       while(v[i]<root)
       {
           i++;
       }
       
       //來到這說明i>=root,即i是該根結點的右子樹了
       //如果右子樹中存在一個值<根結點,那麼不是後續,直接return false
       int j=i;
       while(j<end)
       {
           if(v[j]<root)
           {
               return false;
           }
           j++;
       }
       //來到這說明當前根結點滿足 大於左邊序列,小於右邊序列,接下來它的左右子樹也要
       //滿足這個特性
       return _VerifySquenceOfBST(v, start, i-1) && _VerifySquenceOfBST(v, i, end-1);
   }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章