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

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

题目描述

在这里插入图片描述

解题思路

如果仅知道普通二叉树的后序遍历序列,则无法恢复原来的二叉树,因为无法确定左右子树的下标范围。

但这题是二叉搜索树,能够根据特殊性质确定出左右子树的下标范围。

另外,当 endOfLeftindex 递减时,需要注意下标越界问题,并且这里的左边界不是0,而是begin。

class Solution {
    public boolean verifyPostorder(int[] postorder) {
        if (postorder.length == 0) return true;
        return verifyPostorder(postorder, 0, postorder.length - 1);
    }

    //判断 postorder[begin...end] 是否是二叉搜索树的后序遍历结果
    public boolean verifyPostorder(int[] postorder, int begin, int end) {
        // base case
        if (begin >= end) return true;

        int endOfLeft = end;   //左子树的结束索引
        //左子树结束索引对应的元素是第一个比 postorder[end] 小的元素
        while (endOfLeft >= begin && postorder[endOfLeft] >= postorder[end]) endOfLeft--;
        //由于上面 while 遍历时,已经确保了右子树的所有元素都大于 postorder[end],所以要继续判断左子树的正确性
        int index = endOfLeft;
        while (index >= begin && postorder[index] < postorder[end]) index--;
        //首先要保证左子树的正确性,然后继续遍历左子树和右子树
        return (index + 1 == begin) && verifyPostorder(postorder, begin, endOfLeft) 
                && verifyPostorder(postorder, endOfLeft + 1, end - 1);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值