题目描述:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果,如果是则输出Yes,否则输出No(假设输入的数组的任意两个数字都互不相同)
class Solution {
public:
bool Verify(vector<int> seq)
{
int len = seq.size();
if(!len || len == 1 || len == 2)
return true;
else if(len == 3)
{
if(seq[0] > seq[2] && seq[1] > seq[0])
return false;
else if(seq[0] > seq[2] && seq[1] < seq[2])
return false;
else
return true;
}
vector<int> left;//存放左子树
vector<int> right;//存放右子树
int num = seq[len - 1];//根节点
int i, j;
for(i = 0; i < len - 1; i++)
{
if(seq[i] > num)
break;//找到根节点所在位置,以此为界限划分左右子树,分别存放到left和right中进行递归
}
if(i == 0)
{
right = seq;
right.pop_back();//数字序列全部大于根节点,说明只有右子树,注意要把根节点弹出
}
else if(i == len - 1)
{
left = seq;
left.pop_back();//数字序列全部小于根节点,说明只有左子树,注意要把根节点弹出
}
else
{
for(j = 0; j < len - 1; j++)
{
if(j < i)
left.push_back(seq[j]);//划分左右子树,此时左子树肯定全小于根节点,右子树不一定
else
right.push_back(seq[j]);
}
}
for(i = 0; i < right.size(); i++)
{
if(num > right[i])
return false;//右子树中有大于根节点的直接返回false
}
return Verify(left) && Verify(right);
}
bool VerifySquenceOfBST(vector<int> sequence) {
int len = sequence.size();
if(!len)
return false;
else
return Verify(sequence);
}
};