【劍指offer】二叉搜索樹的後序遍歷序列

題目描述

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


分析:

一看到後序遍歷,就要反應出來:從後向前遍歷數組,我可以找到該二叉樹每棵子樹的根。

其實,這道題前序和後序遍歷,解題方法是完全一樣的,因爲只要該遍歷中包含了根的信息,就可以按照BST樹的定義來檢查。

所以,中序遍歷不行。因爲中序遍歷不顯含根的位置信息。


這樣,檢驗該二叉樹是否是BST,就可以根據定義來做了。

因爲BST樹的中序遍歷爲從小到大嚴格虛遞增的序列,故找到一個子樹的根,就對數組從前向後遍歷,找到其第一個大於該根的值,以此分成左右兩棵子樹。

檢查左子樹上所有值是不是小於該根,右子樹上所有值是不是大於該根。如果不是,返回false,如果是,則繼續向前一位,重複上述過程。

當發現左右子樹均爲空時,返回true。

思路很簡單,就是按照BST樹的定義來檢查。

先給一個遞歸的實現,吃完飯再來給出迭代的實現方式。

class Solution {
public:
    bool VerifySquenceOfBST(vector<int>& sequence) {
        if(sequence.size() == 0)
            return false;
		return isPostOrderOfBST(sequence,0, sequence.size());
    }
private:
    bool isPostOrderOfBST(const vector<int>& input, int begin, int offEnd)
    {
        if(offEnd - begin < 2)
            return true;
        int lastIndex = offEnd - 1;
        int i = begin;
        for(; i < lastIndex; i++)
        {
        	if(input[i] > input[lastIndex])
                break;
        }
        
        for(int j = i; j < lastIndex; j++)
        {
            if(input[j] <= input[lastIndex])
                return false;
        }
        
        return isPostOrderOfBST(input, begin, i) &&
            	isPostOrderOfBST(input, i, lastIndex);
    }
};


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