二叉搜索数的后序遍历

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

思路:所谓二叉搜索数,就是对于所有的节点,节点左边的子节点都小于该节点,节点右边的子节点都大于该节点。已知二叉搜索树的后序遍历,则数组的最后一个节点为根节点。遍历数组找到第一个比根节点大的下标,则该下标往后应该都是右子树,也就是说往后应该都比根节点大。根据这一点来对二叉树进行拆分和递归,确保对于每一个节点满足上述要求即可。

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

        if(sequence!=null){
            if(sequence.length>0){
            //重载方法为了方便递归,增加了两个下标来限定数组,避免创建新的数组。
                return VerifySquenceOfBST(sequence,0,sequence.length-1);
            }
        }
        return false;
    }

    public boolean VerifySquenceOfBST(int [] sequence,int from,int to){
        if(sequence.length>0&&to>from){//递归结束条件。如果某个子树遍历到只剩一个元素,那么这次遍历就是成功的。
            int root = sequence[to];//根节点是数组的最后一个元素。
            int index = from;
            for(int i=from;i<=to;i++){
                if(sequence[i]>=root){
                    index = i;//找到分界点
                    break;
                }
            }
            //检查分界点右边所有的节点是否满足二叉搜索树的条件,然后递归。
            return checkRight(sequence,index,to-1,root)&&VerifySquenceOfBST(sequence,from,index-1)&&VerifySquenceOfBST(sequence,index,to-1);
        }
        return true;
    }

    public boolean checkRight(int [] array,int from,int to,int root){
        for(int i = from;i<=to;i++){
            if(array[i]<root){
                return false;
            }
        }
        return true;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值