import java.util.*;
public class Solution {
    /*
  思路:由于题目给出的是二叉搜索树的后续校验。
        所以,我们应该充分的往二叉搜索树中的性质方面考虑,并且利用它的性质解题
        性质:对于任何一个根来说,根的左边全部小于根,根的右边全部大于根。并且后续数组中尾元素一定是根!
        所以!我们只需要找一个分界值,这个分界值可以用来区分根的左右子树。
        然后分别递归校验左右子树即可。(因为左右子树校验思路一样,所以可以递归)
        
        代码步骤就是:
            1)通过根节点,来找一个分界值,用来区分左右子树(当分界值找到后。那么对于分界值的左边所有元素就是当前根的左子树,分界值以及分界值的右边就是当前根的右子树。)
            2)提前校验右子树中是否全部元素大于根,只要有一个不是,提前终止程序!
            3)递归校验左子树。递归校验右子树!
        
        递归终止条件:当数组中为空就return true;
    */
    public boolean VerifySquenceOfBST(int [] sequence) {
        if(sequence.length==0) return false;
        return jiaoyan(sequence);
    }

    public boolean jiaoyan(int[] sequence){
        // 递归终止条件:数组为空停止。
        if(sequence.length<1) return true;
        
        int index=0;
        // 获取根节点
        int root = sequence[sequence.length-1];
         // 先找一个左右子树的分界值
        while(index<sequence.length-1){
            if(sequence[index]>root){
                break;
            }
            index++;
        }
        // 程序能执行到此处,说明index 左边的元素全是左子树, index 右边的元素全是右子树
        // 先校验右子树中是否全部元素大于根。
        int temp = index;
        while(temp<sequence.length-1){
            if(sequence[temp]<root){
                return false;
            }
            temp++;
        }
        // 递归校验左子树
        boolean left = jiaoyan(Arrays.copyOfRange(sequence,0,index));
        // 递归校验右子树
        boolean right = jiaoyan(Arrays.copyOfRange(sequence,index,sequence.length-1));
        return left && right;
    }
}