剑指Offer——二叉搜索树的后序遍历序列

题目描述:

输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出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 };
原文地址:https://www.cnblogs.com/jacen789/p/7747635.html