剑指 offer 33 二叉搜索树的后序遍历序列(单调栈,利用后序遍历倒序特点)

1 题目描述

 

2 算法思路

思路:

  • 后序遍历序列本质上就是: 左 、 右 、 根节点
  • 那后序遍历序列的倒序,就是:根节点、右、左
  • 那么利用后序遍历序列倒序这个特点,我们可以利用一个单调栈来进行判断。

 

判断的思路大致如下,后序遍历倒序 [ 5 ,6 ,2, 3, 1]

  • 由于倒序序列的第一个节点肯定为根节点5,后面遇见递增的节点,就说明是右子树,那么就加入单调栈
  • 当遇见递减的 ,即 2 ,就需要进行判断
    • 首先2肯定是左子树的,因此需要找到2的根节点,依次弹出单调栈 6 和 5 ,找到2 的父节点5,条件满足(栈空) ,2 就加入单调栈
    • 此时更新根节点root = 5
    • 然后继续遍历,3也是递增的,3 > 2 加入单调栈

算法流程:

  1. 初始化单调栈stack ,父节点为root = 正无穷  ,将整个树看作root的左子树
  2. 倒序遍历序列
    1. 判断,当前节点 > root, 因为此时应该都是左子树,应该都小于root,因此返回false
    2. 更新root,当栈不为空,且 当前节点 < stack.peek(),循环弹出栈,并将值赋给root
    3. 将当前节点入栈

3 代码

class Solution {
    public boolean verifyPostorder(int[] postorder) {
        Stack<Integer> stack = new Stack<>();
        int root = Integer.MAX_VALUE;
        for(int i = postorder.length - 1; i >=0 ;i--){
            if(postorder[i] > root)
                return false;
            while(!stack.isEmpty() && stack.peek() > postorder[i]){ //出现递减
                root = stack.pop();
            }
            stack.add(postorder[i]);
        }
        return true;
    }
}

4 提交结果

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值