题目:
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
思路:
遍历sequence,直到遇到比最后一个值大的;此时sequence被最后一个值分为左右两个部分,若次数组是某二叉搜索树的后序遍历的结果,则右半部分(最后一个值除外)应该全部比最后一个值大,验证是否满足,不满足返回失败,否则递归验证左右两部分。
代码:
//方法一 需要额外空间保存左右两部分
class Solution {
public:
bool VerifySquenceOfBST(vector<int> sequence)
{
if (sequence.empty())
return false;
return (Verify(sequence));
}
bool Verify(vector<int> sequence)
{
if (sequence.empty())
return true;
int last = sequence[sequence.size()-1];
int i=0;
while(sequence[i] < last)
i++;
vector<int> left(sequence.begin(), sequence.begin() + i);
vector<int> right(sequence.begin() + i, sequence.end() - 1);
for(;i<sequence.size()-1;i++)
{
if (sequence[i] < last)
return false;
}
return (Verify(left) && Verify(right));
}
};
//方法二 优化,维护start,end,保存当前左右两部分起始位置,不需要额外空间保存左右两部分
class Solution {
public:
bool VerifySquenceOfBST(vector<int> sequence)
{
if (sequence.empty())
return false;
return (Verify(sequence, 0, sequence.size()-1));
}
bool Verify(vector<int> &sequence, int start, int end)
{
if (start >= end)
return true;
int last = sequence[end];
int i=start, middle=0;
while(sequence[i] < last)
i++;
middle = i;
for(;i<end;i++)
{
if (sequence[i] < last)
return false;
}
return (Verify(sequence, start, middle-1) && Verify(sequence, middle, end-1));
}
};