是否是BST的后序遍历 VerifySquenceOfBST

题目:二叉搜索树的后续遍历数列

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

        左图的正确后序遍历序列5、7、6、9、1 1、10、8

第一:递归求解方法

 1 public class Solution {
 2     public boolean VerifySquenceOfBST(int [] sequence) {
 3         //先来判断特殊情况,传入的数组为空或者长度为零
 4         //按照定义来说,空树也是二叉树,但是牛客网的刷题系统里默认不是,所以此处返回false
 5         if(sequence==null || sequence.length==0)    return false;
 6         return VerifySquenceOfBST(sequence,0,sequence.length-1);
 7     }
 8     public boolean VerifySquenceOfBST(int [] sequence,int start,int end){
 9         //不太明白.不过写的肯定是基本情况
10         if(start >= end)    return true;
11         int temp= end-1;
12         while(temp >= start && sequence[temp]>sequence[end])     temp--;
13         for(int i=start;i<temp;i++){
14             if(sequence[i]>sequence[end])    return false;
15         }
16         return VerifySquenceOfBST(sequence,start,temp) && VerifySquenceOfBST(sequence,temp+1,end-1);
17     }
18 }

 bug1: 关于16行到底是返回temp+1还是temp还是temp-1,可以拿个正确的后序遍历序列在草稿纸上,画一下temp的遍历过程就能明白

 bug2:16行最后,返回一定是end-1,因为end所在的位置是root啊,已经被排除了

 bug3:第6行要写length-1,忘了-1

 bug4:关于第10行,一定要做下解释,弄了半天才弄明白

序号      0   1    2   3    4       5     6

情况1:   5、7、6、9、1 1、10、8序列,下一步分为5,7,6左树序列  和  9,11,10右树序列 

    对于 0   1    2   ,temp最终为0,end为2

       5、7、6                           

     VerifySquenceOfBST(sequence,start,temp) && VerifySquenceOfBST(sequence,temp+1,end-1);

                   0     0                    1        1

    满足 if(start >= end) return true;

情况2:对于右树序列,也同样可以这样分析

情况3:有空树的情况 

 后序遍历序列为      0    1    2   3    

                            5、7、6、8

最终tem为2,end为3,start为0, 所以 VerifySquenceOfBST(sequence,start,temp) && VerifySquenceOfBST(sequence,temp+1,end-1);

                              0       2                    3  2

     满足 if(start >= end) return true;

第二:本地编译器代码

猜你喜欢

转载自www.cnblogs.com/shareidea94/p/10886694.html