class Solution {
public:
bool VerifySquenceOfBST(vector<int> sequence) {
if (sequence.empty())
return false;
return find(sequence);
}
bool find(vector<int> sequence) {
if (sequence.empty())
return true;
int back = sequence.back();
auto pin = sequence.begin();
while(pin != sequence.end()){
if (*pin < back)
++pin;
else
break;
}
// 此时的pin指向第一个大于back的值或者end指针
vector<int> seq1(sequence.begin(), pin);
auto pin1 = pin;
// 检查右子树是否合规,这里面有back值
while (pin != sequence.end()){
if (*pin >= back)
++pin;
else
return false;
}
// 检查完后构造第二个seq
vector<int> seq2(pin1, sequence.end()-1);
return find(seq1) && find(seq2);
}
};题干:判断一个序列是否是二叉搜索树的后序遍历,且该序列的值均不相同
参考别人的思想,若问题为true,则序列最后元素为树节点,根据其可以将序列分为左子树和右子树两部分。find函数是递归部分
1、首先根据back值分出左子树部分,接着检查右子树部分是否满足都大于back,满足条件则开始下一轮递归
2、这里要注意起初空序列返回为false,但之后若左子树或右子树为空要返回true,所以单独写了递归函数

京公网安备 11010502036488号