【题目描述】输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果,如果是,则输出YES,不是输出NO,假设你的二叉搜索树的结点各不相同。
有关什么是二叉搜索树,请移步:https://blog.csdn.net/aaronlanni/article/details/79180890
由此可以看出,将一个二叉搜索树转换为一个后序遍历的序列,其根结点会将这个序列分为两部分,一部分比根节点小,一部分比根节点大,所以利用这个特性,将这个序列划分,之后观察,如果划分出来的序列在进行划分之时,是否仍然满足这个特性,如果满足,则是,反之,不是。
方法一:递归
在这个序列中,找第一部分,比根节点小的部分,将其压入到容器中,然后,按照这个方法,继续找第二部分,也将其压入到另一个容器中,如果找到了两部分,但是最后的下标与根节点的前一个下标不相等,则表明此时序列中要么是前半部分有大数,要么是后半部分有小数,因此这样的组合并不符合我们所找的序列。
class Solution {
public:
bool VerifySquenceOfBST(vector<int> sequence) {
if(sequence.empty())
return false;
int size=sequence.size();
vector<int> left;
vector<int> right;
int i=0;
while(i<size-1)
{
if(sequence[i]<sequence[size-1])
{
left.push_back(sequence[i]);
++i;
}
else
break;
}
int j=i;
while(j<size-1)
{
if(sequence[j]>sequence[size-1])
{
left.push_back(sequence[j]);
++j;
}
else
break;
}
bool vleft=true;
if(i>0)
{
vleft=VerifySquenceOfBST(left);
}
bool vright=true;
if(j<size-1)
{
vleft=VerifySquenceOfBST(right);
}
return vleft&&vright;//如果这两个有一个不符合,则会有false返回
}
};
方法二:非递归
整体也是上面的思路,只不过在这个时候,重复遍历这个序列,只不过是在遍历的时候,每一次将最后一个根节点去除即可,直到只有一个结点即可
class Solution {
public:
bool VerifySquenceOfBST(vector<int> sequence) {
if(sequence.empty())
return false;
int size=sequence.size();
while(--size)//先将最后一个结点去除
{
int index=0;
while(sequence[index]<sequence[size])
++index;
while(sequence[index]>sequence[size])
++index;
//找到两个序列之后,如果此时并没有到达最后的下标,表明序列不正确
if(index<size)
return false;
}
return true;
}
};
大概的思路就是这样的,如果有什么错误,希望大家指正。
这世上哪有什么奇迹,奇迹源于不放弃!!!