剑指offer:面试题24——二叉搜索树的后续遍历序列
题目:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
思路:当前数组的最后一位是后续遍历的根,其他小于根的数字是左子树,大于根的数字是右子树。因此可以设计,遍历数组直到遇到大于根的值,记录他的长度,继续遍历后面的数组,如果都大于根则有可能是右子树,调用递归分别传递左边和右边子树继续判断,且初值都给为true,只有在不满足右子树条件时给false。如果左右都为true则返回true
牛客的难点在于传递vector,递归位置要遍历vector[n],因此,同时传递的除了被遍历的数组长、数组内容vector,还要传递一个start位置标记当前数组的起始位置。这样每次递归遍历的时候遍历左侧位置初值不给0,而赋成是start。
class Solution {
public:
bool checkBST(vector<int> sequence,int start,int length)
{
int leftlen=0;
int rightlen=0;
int newRoot=sequence[length-1];
int l=start;
while(l<length-1)
{
int lval=sequence[l];
if(lval<newRoot) leftlen++;
else break;
l++;
}
rightlen=length-1-leftlen;
int r=l;
while(r<length-1)
{
int rval=sequence[r];
if(rval<newRoot) return false;
r++;
}
bool left=true;
if(l>start)
left=checkBST(sequence,start,leftlen);
bool right=true;
if(r<length-1)
right=checkBST(sequence,leftlen-1,rightlen);
return (right&&left);
}
public:
bool VerifySquenceOfBST(vector<int> sequence) {
bool isPost=false;
if(sequence.empty())return nullptr;
int length=sequence.size();
isPost=checkBST(sequence,0,length);
return isPost;
}
};