1. 程式人生 > >劍指Offer——二叉搜索樹的後序遍歷序列

劍指Offer——二叉搜索樹的後序遍歷序列

urn tree 輸入 iss 元素 ++ 二叉樹 public class

題目描述:

輸入一個整數數組,判斷該數組是不是某二叉搜索樹的後序遍歷的結果。如果是則輸出Yes,否則輸出No。假設輸入的數組的任意兩個數字都互不相同。


分析:

二叉查找樹(Binary Search Tree),(又:二叉搜索樹,二叉排序樹)它或者是一棵空樹,或者是具有下列性質的二叉樹: 若它的左子樹不空,則左子樹上所有結點的值均小於它的根結點的值; 若它的右子樹不空,則右子樹上所有結點的值均大於它的根結點的值; 它的左、右子樹也分別為二叉排序樹。

數組的最後一個元素是二叉搜索樹的根結點的值,我們可以找到左子樹的所有元素,那麽另一部分就是右子樹的所有元素。

如果右子樹有值小於根結點,那麽該數組就不是某二叉搜索樹的後序遍歷的結果。


代碼:

 1 class Solution {
 2 public:
 3     bool VerifySquenceOfBST(vector<int> sequence) {
 4         int seqSize = sequence.size();
 5         if(seqSize == 0) return false;
 6         if(seqSize == 1 || seqSize == 2) return true;
 7         return IsSquenceOfBST(sequence, 0, seqSize - 1);
 8     }
9 bool IsSquenceOfBST(vector<int> &sequence, int begin, int end) { // end是根結點的值 10 if(end - begin <= 2) return true; 11 int i; 12 for(i = begin; i < end; i++) { 13 if(sequence[i] > sequence[end]) { 14 break; 15 }
16 } 17 int m = i; // m前是左子樹的值 18 for(; i < end; i++) { 19 if(sequence[i] < sequence[end]) { // 右子樹還有比根結點的值要小,那麽這數組就不是二叉搜索樹的後序遍歷的結果 20 return false; 21 } 22 } 23 return IsSquenceOfBST(sequence, begin, m - 1) && IsSquenceOfBST(sequence, m, end - 1); 24 } 25 };

劍指Offer——二叉搜索樹的後序遍歷序列