剑指Offer23_二叉搜索树的后序遍历序列

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


分析:在后序遍历序列中,最后一个数字是树的根节点的值。数组中前面的数字可以分为两部分:第一部分是左子树节点的值,它们都比根节点的值小;第二部分是右子树节点的值,它们都比根节点的值大。

思路:所以先取数组中最后一个数,作为根节点。然后从数组开始计数比根节点小的数,并将这些记作左子树,然后判断后序的树是否比根节点大,如果有的点不满足,则跳出,并判断为不成立。全满足的话,依次对左子树和右子树递归判断。
 

代码及注释如下:

public class Solution {
    public boolean VerifySquenceOfBST(int [] sequence) {
        //空序列应该false
        if(sequence==null||sequence.length<=0) return false;
        //主程序负责初始特殊情况判断和驱动
        return verifySquenceOfBST(sequence,0,sequence.length-1);
    }
    private boolean verifySquenceOfBST(int[] sequence,int start,int end){
        //如果前面分区的时候没有false,那么递归到最后应该都是一个值,去尾两分为空,这时是true
        if(start>=end) return true;
        int root=sequence[end];
        //用i找到小大数值分隔点
        int i=start;
        while(sequence[i]<root){
            i++;
        }
        //如果i之后还有比根节点小的,那就false
        int j=i;
        while(j<end){
            if(sequence[j]<root){
                return false;
            }
            j++;
        }
        //除根节点之外两侧递归
        boolean left=verifySquenceOfBST(sequence,start,i-1);
        boolean right=verifySquenceOfBST(sequence,i,end-1);
        return left&&right;
    }
}

猜你喜欢

转载自blog.csdn.net/lilililililydia/article/details/88707516