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

分析:二叉搜索树的特点,左子树的值一定小于根结点,右子树上的值一定大于根结点;
后序遍历:左右中,所以根结点一定位于数组的最后
以根结点的值为依据,先遍历出数组前面小于root值的节点,为root的左子树的值,再从该点出发遍历到root之前的值,若没有小于root的值,则对左右子树再进行递归。

//引入Arrays.copyOfRange(int[] A,int a,int b);从a到b的索引取出作为一个新的数组
import java.util.Arrays;

public class Solution {
    public boolean VerifySquenceOfBST(int [] sequence) {

        if(sequence==null||sequence.length<=0)
            return false;

        int root=sequence[sequence.length-1];
        int i=0;
        //-1 不算入root节点
        while(i<sequence.length-1){
            if(sequence[i]>root){
                break;
            }
            i++;
        }

        for(int j=i;j<sequence.length-1;j++){
            if(sequence[j]<root){
                return false;
            }
        }
        //int[] sequence1=Arrays.copyOfRange(sequence,0,i-1);
        //int[] sequence2=Arrays.copyOfRange(sequence,i,sequence.length-2);
        boolean left=true;
        //此处原本设置的判断条件为i>0,可是会导致每次Arrays.copyOfRange一直在缩小sequence的长度,直到缩小到null,
        //会时left会调用VerifySquenceOfBST,执行第五行代码,然后返回值为false,设置为1就不会再出现这样的问题
        //其实可以发现,只要sequence的元素个数在1-3个之间都会返回true
        if(i>1)
            left=VerifySquenceOfBST(Arrays.copyOfRange(sequence,0,i-1));

        boolean right=true;
        if(i<sequence.length-1)
            right=VerifySquenceOfBST(Arrays.copyOfRange(sequence,i,sequence.length-2));

        return (left&&right);
    }
}