剑指Offer——二叉搜索树的后序遍历序列(牛客网)

一、问题描述

1、描述

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

2、方法体

public boolean VerifySquenceOfBST(int[] sequence) {

}

二、思路

首先判断左右子树的分界点,如果右子树中包含比根节点小的值,那么序列为假。
其中循环结束条件是传入的开始下标>=结束下标。(因为传的值是子树的开始下标和根节点下标,根节点下标是由原来的根节点下标-1,或者是得到的右子树下标-1得到。所以就会出现开始下标>=结束下标,这种情况下,说明序列遍历结束,没有出现非法序列的情况)

三、反思

在判断非法的时候我考虑找到分界点以后要分别判断左右子树。
但是后来发现,找分界点的过程实际已经判断了左子树的合法性,那么接下来只需要判断右子树的合法性即可。

四、代码

具体实现代码如下:

public class Solution {
   public boolean VerifySquenceOfBST(int[] sequence) {
        if (sequence.length == 0 || sequence == null) {
            return false;
        }
 
        return judgeTree(sequence, 0, sequence.length - 1);
    }
 
    public boolean judgeTree(int[] sequence, int start, int root) {
        //如果开始下标>结束下标,判断结束
        if (start >= root) {
            return true;
        }
        int key = sequence[root];
        int i = 0;
 
        //找到左右子树的分界点
        //i是右子树第一个结点下标
        for (i = start; i < root; i++) {
            if (sequence[i] > key) {
                break;
            }
        }
 
        //判断右子树是否有结点<根节点
        for (int j = i; j < root; j++) {
            if (sequence[j] < key) {
                return false;
            }
        }
 
        return judgeTree(sequence, start, i - 1) && judgeTree(sequence, i, root - 1);
    }
 
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值