题目描述:
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
思路:二叉搜索树左子树节点小于根节点,右子树节点大于根节点,而后序遍历结果的最后一个节点为根节点,由根节点的值和后序遍历序列,求出根节点的左子树和右子树,然后递归,分别判断左右子树是否满足条件。
class Solution {
public:
bool VerifySquenceOfBST(vector<int> sequence) {
if (sequence.empty()) return false;
if (sequence.size() == 1 || sequence.size() == 2) return true;
int i = 0;
int root = sequence[sequence.size()-1];
//左子树
for (; i < sequence.size()-1; ++i) {
if(sequence[i] > root)
break;
}
int j = i;
//右子树
for (; j < sequence.size()-1; ++j) {
if (sequence[j] < root)
return false;
}
//判断左子树
bool left = true;
if (i > 0){
vector<int> leftS;
//注意assign包含第一个参数指向的元素,不包含第二个参数指向的元素
leftS.assign(sequence.begin(), sequence.begin()+i);
left = VerifySquenceOfBST(leftS);
}
//判断右子树
bool right = true;
if (i < sequence.size() - 1) {
vector<int> rightS;
rightS.assign(sequence.begin()+i,sequence.begin()+j);
right = VerifySquenceOfBST(rightS);
}
return (left && right);
}
};