题目描述
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
思路
- 根据二叉搜索树的后续遍历特点,序列最后一个元素为树的根root,左边小于root的部分为树的左子树,在左子树的右边root之前的序列如果都大于root,则为右子树。
- 其中,左子树和右子树的序列都有可能为空;左子树的右边root之前的元素中,如果不全为大于root的值,则可知道已知序列不是正确的遍历序列,返回false。
- 在左子树序列和右子树序列中分别执行以上过程。
- 如果左子树和右子树都是二叉搜索树,则已知序列正确,返回true;
public class Solution {
public boolean VerifySquenceOfBST(int [] sequence) {
if(sequence==null||sequence.length==0){
return false;
}
return doVerify(sequence,0,sequence.length-1);
}
public boolean doVerify(int [] sequence,int l,int r){
if(r-l<=0){
return true;
}
int len=r-l+1;
int root=sequence[r];
//找到第一个大于根结点的数
int i=l;
for(;i<r;i++){
if(sequence[i]>root){
break;
}
}
int j=i;
for(;j<r;j++){
if(sequence[j]<root){
return false;
}
}
//判断左子树是否是二叉搜索树
boolean left=true;
if(i>l){
left=doVerify(sequence,l,i-1);
}
//判断右子树是否是二叉搜索树
boolean right=true;
if(i<r){
right=doVerify(sequence,i,r-1);
}
return left&&right;
}
}