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