題目描述
輸入一個整數數組,判斷該數組是不是某二叉搜索樹的後序遍歷的結果。如果是則輸出Yes,否則輸出No。假設輸入的數組的任意兩個數字都互不相同。
首先我們給出二叉搜索樹的定義:
二叉搜索樹,也稱有序二叉樹,排序二叉樹,是指一棵空樹或者具有下列性質的二叉樹:
1. 若任意節點的左子樹不空,則左子樹上所有結點的值均小於它的根結點的值;
2. 若任意節點的右子樹不空,則右子樹上所有結點的值均大於它的根結點的值;
3. 任意節點的左、右子樹也分別爲二叉查找樹。
4. 沒有鍵值相等的節點。
1)若序列長度爲1,則爲後序遍歷序列,返回true,只有一個根節點;若無空序列,則返回false
2)根據最後一個根節點劃分前面的序列爲左子樹序列A,右子樹序列B
(劃分過程中若出現,後半序列有小於根節點的情況,則不符合二叉搜索樹定義,返回false,代碼中標紅)
3)遞歸判斷A,B是否爲二叉搜索樹的後序遍歷序列 (非空序列)
class Solution {
public:
bool VerifySquenceOfBST(vector<int> sequence) {
if(sequence.size() == 0)
return false;
if(sequence.size() == 1)
return true;
int size = sequence.size();
int rootvalue = sequence[size-1];
vector<int> sequence1,sequence2;
int i,j;
for(i = 0; i < size; ++ i){
if(sequence[i] < rootvalue)
sequence1.push_back(sequence[i]);
else
break;
}
cout << "i = " << i << endl;
j = i;
for(;i < size-1; ++i){
if(sequence[i] > rootvalue)
sequence2.push_back(sequence[i]);
else
return false;
}
bool res1 = true, res2 = true;
if(j>0){
res1 = VerifySquenceOfBST(sequence1);
}
if(size-j>1){
res2 = VerifySquenceOfBST(sequence2);
}
return res1&&res2;
}
};