题目描述
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
解法:1.二叉搜索树,左子树不能大于根节点的值,右子树不能小于根节点的值
2.后续遍历,根节点在最后一位。所以先找出根节点,然后左右子树的分界点,最后再用递归即可解决问题。
class Solution {
public:
bool VerifySquenceOfBST(vector<int> sequence) {
int len = sequence.size();
vector<int> left;
vector<int> right;
if(len == 0) return false; //空的数组返回false
int root;
int i = 0;
root = sequence[len-1];
for(; i < len - 1; i++) { //找到根节点处的左子树,所有值都小于根节点
if(sequence[i] > root)
break; //此时指向了右子树处
}
int j = i; //此时j指向右子树这边
for(; j < len - 1; j++) { //右子树,所有值应该大于根节点,一旦不成立,返回false
if(sequence[j] < root)
return false;
}
//左子树继续递归调用
bool l = true;
if(left.size() > 0) {
for(int n = 0; n < j; i++) left[n] = sequence[n]; //左子树赋值
l = VerifySquenceOfBST(left);
}
//右子树继续递归调用
bool r = true;
if(right.size() > 0) {
for(int m = j; i < len - 1; i++) right[m] = sequence[m]; //右子树赋值
r = VerifySquenceOfBST(right);
}
return (l&&r);
}
};