天天看点

判断二叉搜索树的后序遍历序列问题

public class Solution {
    public boolean VerifySquenceOfBST(int [] sequence) {
        if(sequence==null||sequence.length==0) return false;
        if(sequence.length==1) return true;
        return find(sequence,0,sequence.length-1);
    }
    public boolean find(int[] array,int start,int end){
        if(start>=end)return true;
        //int root=;
        int i=end;
        while(i>start&&array[i-1]>array[end])
        {
            i--;
        }
      
        for(int j=start;j<=i-1;j++){
            if(array[j]>array[end])
            return false;
        }
        return find(array,start,i-1)&&find(array,i,end-1);
    }
}
           

后序遍历的特点就是根节点在最后,结合二叉搜索树的性质,根节点的左子树值均小于根节点,右子树值均大于根节点。所以,我们可以得到,在给定数组中,凡是小于根节点的为左子树部分,大于根节点的为右子树部分。但是如果在左子树中找到大于根节点,或在右子树中找到小于根节点的,则给定序列就不是后序遍历的结果。

这里我用递归的思想,将一个数组问题利用分治的思想,从后往前查找,直到第一次找到小于根节点的值array[i-1],这个值作为左子树的根节点,相对应的i~end-1的部分就是我们的右子树了。一层一层递归下去就是我们想要的结果。

继续阅读