/*
(1)二叉树后序遍历,序列最后为根节点,序列(除了最后根节点)前半部分为左子树,后半部分为右子树;
(2)二叉搜索树,若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
它的左、右子树也分别为二叉排序树。
递归思路:
1确定跟节点的值,即后序遍历序列最后的值;
2根据(1)(2)两条,遍历序列,记录第一个比根节点大的值的位置,继续遍历,如果之后序列的所有值
存在比根节点小的值,直接返回false,如果不存在则判断其子树是否为二叉搜索树。
3第一个比根节点大的值之前的子序列为左子树,之后(包括该值)为右子树,根据递归思想,重复步骤1,2.直到子树根节点的左右子节点均为空;
*/
class Solution {
public:
bool VerifySquenceOfBST(vector<int> sequence) {
int size = sequence.size();
if(0==size)
return false;
return isLastOrder(sequence,0,size-1);
}
bool isLastOrder(vector<int> sequence,int begin,int end){
if(begin==end)
return true;
int middle = begin;
while(sequence[middle++]<sequence[end] && middle<end);
int tmp = middle;
while(sequence[tmp++]>sequence[end] && tmp<end);
if(tmp<end)
return false;
if(middle==begin || middle==end)
return isLastOrder(sequence,begin,end-1);
else
return (isLastOrder(sequence,begin,middle-1) && isLastOrder(sequence,middle,end-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;
}
};