题目描述
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。
如果是则返回true,否则返回false。
假设输入的数组的任意两个数字都互不相同。
样例
输入:[4, 8, 6, 12, 16, 14, 10]
输出:true
问题分析
用judge函数判断某一区间是不是某二叉搜索树的后序遍历的结果。这个区间最右边的元素是二叉搜索树的根节点。然后我们遍历除了根节点的区间,当遇到第一个不小于根节点的元素时停止,这时就已经找出了左子树的节点,然后继续遍历剩下的区间,也就是检查右子树的节点的值,如果不是都大于根节点的值,说明肯定不是二叉搜索树了,返回false。如果到这里都满足,那么接下来分别用左区间调用递归函数judge和用右区间调用递归函数judge,如果两个递归函数都返回true那么返回true,否则返回false。
代码实现
class Solution {
public:
bool verifySequenceOfBST(vector<int> sequence) {
int n = sequence.size();
if(n == 0)
return true;
return judge(0, n - 1, sequence);
}
bool judge(int start, int end, vector<int>& sequence){
if(start >= end)
return true;
int root = sequence[end];
int l = start;
while(sequence[l] < root){
++l;
}
for(int i = l; i < end; i++){
if(sequence[i] < root)
return false;
}
return judge(start, l - 1, sequence) && judge(l, end - 1, sequence);
}
};