輸入一個整數數組,判斷該數組是不是某二叉搜索樹的後序遍歷的結果。如果是則輸出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);
}
};