题目描述
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
class Solution {
public:
//利用后序遍历的特点,最后一个数为根节点,剩下的部分可以分半成左子树和右子树,
//再结合二叉搜索树的特点,左边小右边大,就能判断了
bool VerifySquenceOfBST(vector<int> &sequence) {
if (sequence.size() == 0)
return false;
return VerifyCore(sequence, 0, sequence.size()-1);
}
private:
bool VerifyCore(vector<int> &vec, int start, int end)
{
if (start >= end)
return true;
//最后节点为根节点
int root = vec[end];
int i = start;
for (; i < end; ++i)
{
//找到左右子树的分界点
if (vec[i] >= root)
break;
}
//检查右子树是否符合二叉搜索树的特点
for (int j = i + 1; j < end; ++j)
{
if (vec[j] < root)
return false;
}
//递归检查左右子树
return VerifyCore(vec, start, i - 1) && VerifyCore(vec, i, end - 1);
}
};