剑指 Offer 33. 二叉搜索树的后序遍历序列

这篇博客探讨了一个关于二叉搜索树的问题,即如何验证给定的后序遍历序列是否合法。文章中提供了一个名为`verifyPostorder`的方法,通过寻找左右子树的边界并检查区间内元素的关系来实现。该方法首先找到右子树的边界,然后判断右子树的所有元素是否都小于根节点,同时确保左子树的元素都大于根节点。通过递归地处理子问题,最终确定整个序列是否符合后序遍历的性质。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

因为是搜索二叉树,所以 左结点 < root < 右结点
先遍历找到 大于数组最后一个数(也就是root)的索引
则 [left,i-1]为右子树的区间,[i,right-1]为左子树的区间
判断右子树区间内的数是否都小于 root(也就是postorder[right])判断左子树区间内的数是否都大于 root

public class Offer33 {

    private int[] postorder;

    public boolean verifyPostorder(int[] postorder) {
        this.postorder = postorder;
        return helper(0,postorder.length - 1);

    }

    /** 创建一个方法,传入子树的左右区间,返回是否为后序遍历*/
    public boolean helper(int left,int right){
        /** 终止条件: 穿过叶子结点,即区间大小为0;*/
        if (left >= right) return true;

        /** 寻找左右子树的界限,*/
        int i = left;
        while (postorder[i] < postorder[right]){
            i++;
        }

        /** 判断当前root结点的左右子树是否满足后序遍历,
         * 其中左子树已经在寻找界限的时候已经满足了,所以只需要判读右子树即可*/
        int j = i;
        while (postorder[j] > postorder[right]){
            j++;
        }
        Boolean flag = true;
        if (j != right) flag = false;

        /** 问题与子问题之间的联系:*/
        return flag && helper(left,i-1) && helper(i,right-1);
    }


}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值