原創文章,轉載請注明出處!
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二叉樹