题目描述
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
二叉查找树(Binary Search Tree):
1. 是一棵空树;
2. 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
3. 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
4. 它的左、右子树也分别为二叉排序树。
----------------------------------------------------------------
思路:
已知条件:后序序列最后一个值为root;二叉搜索树左子树值都比root小,右子树值都比root大。
1、确定root;
2、遍历序列(除去root结点),找到第一个大于root的位置,则该位置左边为左子树,右边为右子树;
3、遍历右子树,若发现有小于root的值,则直接返回false;
4、分别判断左子树和右子树是否仍是二叉搜索树(即递归步骤1、2、3)。
------------------------------------------------------------------
BTS后序遍历 的序列中,最后一个数字是树的根节点 ,数组中前面的数字可以分为两部分:第一部分是左子树节点 的值,都比根节点的值小;第二部分 是右子树 节点的值,都比 根 节点 的值大,后面用递归分别判断前后两部分 是否 符合以上原则
/*
//递归
class Solution {
public:
bool VerifySquenceOfBST(vector<int> sequence) {
int size = sequence.size();
if(0==size)
{
return false;
}
return isLastOrder(sequence, 0, size-1);
}
private:
bool isLastOrder(vector<int>& sequece, int b, int e)
{
if(b==e)
{
return true;
}
int mid = b;
while(sequece[mid++]<sequece[e] && mid<e);
int tmp = mid;
while (sequece[tmp++]>sequece[e] && tmp<e);
if(tmp<e)
{
return false;
}
if(mid==b || mid==e)
{
return isLastOrder(sequece, b, e-1);
}
else
{
return (isLastOrder(sequece, b, mid-1) && isLastOrder(sequece, mid, e-1));
}
}
};*/
非递归:
//非递归
//非递归也是一个基于递归的思想:
//左子树一定比右子树小,因此去掉根后,数字分为left,right两部分,right部分的
//最后一个数字是右子树的根他也比左子树所有值大,因此我们可以每次只看有子树是否符合条件
//即可,即使到达了左子树左子树也可以看出由左右子树组成的树还想右子树那样处理
//对于左子树回到了原问题,对于右子树,左子树的所有值都比右子树的根小可以暂时把他看出右子树的左子树
//只需看看右子树的右子树是否符合要求即可
class Solution {
public:
bool VerifySquenceOfBST(vector<int> sequence) {
int size = sequence.size();
if(0==size)return false;
int i = 0;
while(--size)
{
while(sequence[i++]<sequence[size]);
while(sequence[i++]>sequence[size]);
if(i<size)return false;
i=0;
}
return true;
}
};