劍指offer刷題————二叉搜索樹的後序遍歷序列

問題重述:

題目:輸入一個整數數組,判斷該數組是不是某二叉搜索樹的後序遍歷的結果。如果是則返回true,否則返回false.假設輸入的數組任一兩個數組都不相同。

思路解析:

首先這個數組是搜索二叉樹的後序遍歷,因爲搜索二叉樹滿足左小右大的規則,並且後序遍歷中最後一個遍歷的是根節點,因此,我們能根據最後一個數字將數組分爲兩部分,前面的一部分都比最後一個節點小,後面的一部分都比最後一個節點大。

因此,整體思路是這樣的:將最後一個數字作爲根節點提出來,從頭開始和這個數字進行比較,當遇到第一個比根節點大的數字的時候跳出並記錄下位置,假設這個位置爲i,數組的長度爲length,那麼0到i-1都是左子樹,i到length-1都是右子樹,再找到i以後,我們從i處繼續往後遍歷,如果遇到比根節點小的樹,那麼這個樹就不是二叉搜索樹。遞歸的進行判斷即可。

代碼實現:

class Solution {
public:
    bool VerifySquenceOfBST(vector<int> sequence) {
        //思路:從二叉搜索樹的性質上進行判斷:左小右大
        //所以:中序後序遍歷數組中的樹總滿足這樣的性質:一半的數都比自己小,另一半的數都比自己大
        if(sequence.size()<1)
            return false;
        int length = sequence.size()-1;
        return  Verfy(sequence,0,length);
        
    }
    bool Verfy(vector<int>sequence,int start,int end)
    {
       
        
        int root = sequence[end];
        //找到左邊的節點
        int i = 0;
        for(;i<end;++i)
            if(sequence[i]>root)
                break;
        //在右子樹中遇到比根小的就返回false
        int j = i;
        for(;j<end;++j)
            if(sequence[j]<root)
                return false;
        //判斷左右子樹
        bool left = true;
        if(i>0)
            left = Verfy(sequence,0,i-1);
        bool right = true;
        if(j<end)
            right = Verfy(sequence,i,end-1);
        return left&&right;
        
    }
};

 

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