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