①题目
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出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页学来的。