原創文章,轉載請注明出處!
1.題目
輸入一個整數數組,判斷該數組是不是某二叉搜索樹的后序遍歷的結果。如果是則輸出Yes,否則輸出No。假設輸入的數組的任意兩個數字都互不相同。
舉例:序列{5,7,6,9,11,10,8}是下圖二叉搜索樹的后序遍歷結果。

2.思路
性質:
- 二叉排序樹的性質:左子樹上所有節點的值均小於它的根節點;右子樹上所有節點的值均大於它的根節點。
- 二叉排序樹后序遍歷的性質:序列最后一個數字是根節點,序列剩余部分分成兩部分,前一部分是左子樹,后一部分是右子樹。
舉例:
- 判斷序列{5,7,6,9,11,10,8}是否是二叉排序樹的后序遍歷。其中,8是根節點,{5,7,6}比8小是左子樹,{9,11,10}比8大是右子樹。
- 判斷{5,7,6}是否是二叉排序樹,其中6是根節點,5比6小是左子樹,7比6大是右子樹。
- 判斷{9,11,10}是否是二叉排序樹,其中10是根節點,9比10小是左子樹,11比10大是右子樹。
3.代碼
class Solution {
public:
bool VerifySquenceOfBST(vector<int> sequence) {
return bst(sequence, 0, sequence.size() - 1);
}
private:
bool bst(vector<int> seq, int begin, int end){
// 邊界條件
if(seq.empty() || begin > end)
return false;
// 划分左右子樹,並判斷左右子樹和根節點的關系
int i = begin;
for(; i < end; ++i)
if(seq[i] > seq[end])
break;
int j = i;
for(; j < end; ++j)
if(seq[j] < seq[end])
return false;
// 判斷左子樹是不是二叉搜索樹
bool left = true;
if(i > begin)
left = bst(seq, begin, i - 1);
// 判斷右子樹是不是二叉搜索樹
bool right = true;
if(i < end - 1)
right = bst(seq, i , end - 1);
return left && right;
}
};
4.測試用例
- 空指針
- 后序遍歷對應一顆BST二叉樹
- 一個結點的BST二叉樹
- 無左子樹的BST二叉樹
- 無右子樹的BST二叉樹
- 完全二叉樹
- 后序遍歷不對應一顆BST二叉樹
