二叉搜索树的后序遍历序列

肉饼铺子 2018-04-21

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

思路挺清晰的,但是不知道为什么,提交了好几次都只能通过部分用例,最后修修改改才通过的。总感觉我的这个做法不太好。

首先,后序遍历的最后一个元素是树的根节点root,然后可以将整个序列分成两个部分,分别是root的左子树和右子树,左子树的所有元素都比root小,右子树的所有元素都比root大。按照这个思路,就可以用左右子树分别递归,最后判断是否满足条件了。

代码如下:

public boolean VerifySquenceOfBST(int [] sequence) {
        int leftRoot = 0, rightRoot = sequence.length-1;

        if (sequence.length == 0) return false;

        if (sequence.length <= 3) return true;    //只有一个后序序列,当只有三个节点的时候只能返回true

        for (int i=0; i<sequence.length; i++) {     //找到第一个比root大的元素的位置,确定左子树的范围
            if (sequence[i] >= sequence[sequence.length-1]) {
                leftRoot = i;
                break;
            }
        }

        for (int i=leftRoot+1; i<sequence.length; i++) {    //判断右子树的所有元素是否比root大
            if (sequence[i] < sequence[sequence.length-1]) return false;
        }

        if (leftRoot >= rightRoot)
            return VerifySquenceOfBST(Arrays.copyOfRange(sequence, 0, leftRoot));
        if (leftRoot == 0)
            return VerifySquenceOfBST(Arrays.copyOfRange(sequence, leftRoot, rightRoot));

       return VerifySquenceOfBST(Arrays.copyOfRange(sequence, 0, leftRoot))
               && VerifySquenceOfBST(Arrays.copyOfRange(sequence, leftRoot, rightRoot));
 }

相关推荐