[剑指offer] 二叉搜索树的后序遍历序列 (由1个后续遍历的数组判断它是不是BST)

①题目

    输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。

②思路

    1、后续遍历的数组里,最后一个元素是根。

    2、在BST里,左子树每个元素<根<右子树每个元素

    3、从第0位开始,找到第一个>根节点的元素,记录此位置i。在此位置之前都属于左子树(此时已经断定左子树都小于根节点) 

    4、检查右子树是否都大于跟节点(从第i位开始,到根节点前) 

    5、递归判断左右子树是否都属于BST,也即重复3-4步;

③代码

  

 1 public class Solution {
 2     public boolean VerifySquenceOfBST(int [] sequence) {
 3         boolean[] res = new boolean[1];
 4         res[0] = true;
 5         if(sequence.length==0)         //如果输入为空,那么直接返回false
 6             return false;
 7         isBST(0,sequence.length-1,res,sequence);  //调用函数,在函数里根据各种判断条件来改动res[0]
 8         return res[0];
 9     }
10     
11     public int isBST(int start,int end,boolean[] res,int[] sequence){
12             if(start>=end)   //1种退出条件
13                 return start;
14             int mid = (start+end)>>>1;    //除以2
15             int curr_root = sequence[end];
16             int i=start;   //这一步不能写在for循环里面,否则会在第21行报错说不认识i
17             for(;i< end;i++){
18                 if(sequence[i]>curr_root)
19                     break;   //一旦找到第一个>根的元素,立刻break出去
20             }
21             for(int j=i;j< end;j++){
22                 if(sequence[j]<curr_root){ 
23                     res[0]=false;   //改变res[0]的值
24                     return start;   //isBST这个函数只是为了改动res[0]的值,所以随便返回个什么东西就行了,比如我返回个start
25                 }
26             }
27             isBST(start,mid-1,res,sequence);  //递归判断左子树,
28             isBST(mid,end-1,res,sequence);  //递归判断右子树
29             return start;
30     }
31 }

④学到的东西

    1、做了Leeccode的108题,于是把>>>的写法学来了,用在了本题第14行。

    2、一定要学会怎么用后序遍历数组来判断是不是BST,也就是本题第②点的分析过程;

    3、使用res[0]标志位,并且用整个isBST函数来改变res[0]的值,以至于isBST这个函数的返回值返回什么都不重要了,这种方法我是从《程序员代码面试指南:IT名企算法与数据结构题目最优解》的145页学来的。

猜你喜欢

转载自www.cnblogs.com/zf007/p/11668835.html