题目描述
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
class Solution {
public:
bool VerifySquenceOfBST(vector<int> sequence) {
int size = sequence.size();
if(0 == size)
return 0;
return Verifyeachpoint(sequence, 0, size-1);
}
//对于每个节点,出现在它们之前的首先是大于它们的点,再是小于它们的点
//如果不符合,返回0
bool Verifyeachpoint(vector<int> sequence, int start, int end)
{
if(start == end)
return 1;
//先取最后一个点,因为是根节点
int val = sequence[end];
//找到前面最近的大于和小于这个节点的点的位置
int biggerpos=-1,smallerpos = -1;
for(int i = start; i<end; ++i)
{
if(sequence[i]>val)
biggerpos = i;
else if(sequence[i]<val)
smallerpos = i;
}
// smallerpos之前的点全部小于 val
for(int i=start; i<=smallerpos; ++i)
{
if(sequence[i]>val)
return 0;
}
//递归到子节点
if(biggerpos == -1 || smallerpos == -1)
return Verifyeachpoint (sequence, start, end-1 );
return Verifyeachpoint (sequence, start, smallerpos) && Verifyeachpoint (sequence, smallerpos+1, biggerpos);
}
};