import java.util.*;
public class Solution {
    // 二叉搜索树的后序遍历序列,判断某数组是否为某二叉搜索树的后序遍历
    // 二叉搜索树特性:左子树的所有节点都小于根节点,右子树所有节点都大于根节点;中序遍历是有序的
    // 后序遍历:左右根
    // 数组中最后的节点一定是根节点
    // 思路:根据最后一个节点时根节点,划分出左子树和右子树,左子树全部小于根节点,右子树全部大于根节点。划分完了之后,因为我们是根据第一个大于根节点的元素进行划分的,所以只需要验证划分出来的右子树全部大于根节点。之后递归进行这一过程
    public boolean VerifySquenceOfBST(int [] sequence) {
        // 因为这里有一个递归出口了,但是真正的递归出口应该是sequence.length<1,所以将递归部分单独分开作为一个函数来写
        if (sequence.length == 0) return false;
        

        return Judge(sequence);
    }
    public boolean Judge(int[] sequence) {
        if (sequence.length < 1) return true;
        int i = 0;
        int root = sequence[sequence.length - 1];

        for (; i < sequence.length-1; i++) {
            // 找到根节点
            // 找到划分左右子树的点 i
            if (sequence[i] > root) {
                for (int j = i + 1; j < sequence.length - 1; j++) {
                    if (sequence[j] < root) {
                        return false;
                    }
                }
            }
        }
        // 递归遍历左子树
        boolean left = Judge(Arrays.copyOfRange(sequence, 0, i));
        // 递归遍历右子树
        boolean right = Judge(Arrays.copyOfRange(sequence, i, sequence.length - 1));

        return left && right;
    }
}