剑指offer-22-二叉搜索树的后序遍历序列
- 题目:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
- 思路:在某二叉搜索树的后序遍历结果中,数组的最后一个数为根节点的值。前面的数字可以分为两部分:第一部分是左子树节点的值,均比跟节点的值小;第二部分是右子树节点的值,均比根节点的值大。(**二叉搜索树:对于这颗树上任意一个节点为头的子树,左子树都比它小,右子树都比它大。**通常二叉搜索树中不存在重复节点)
1、确定root;
2、遍历序列,找到第一个大于root的位置,则该位置左边为左子树,右边为右子树(包含该位置,去掉root);
3、遍历右子树,若发现有小于root的值,则直接返回false;
4、分别判断左子树和右子树是否仍是二叉搜索树(即递归步骤1、2、3) - 边界:递归函数的输入有三个部分:数组,start下标,end下标。注意结束条件end<=start。
- 代码
public class Solution {
public boolean VerifySquenceOfBST(int [] sequence) {
if(sequence.length==0){
return false;
}
return isBST(sequence,0,sequence.length-1);
}
public boolean isBST(int[] sequence,int start,int end){
if(end<=start){
return true;
}
int root = sequence[end];
int i = start;
for(;i<end;i++){()
if(sequence[i]>root){
break;
}
}
for(int j=i+1;j<end;j++){
if(sequence[j]<root){
return false;
}
}
return isBST(sequence,0,i-1)&&isBST(sequence,i,end-1);
}
}