LeetCode—剑指Offer:二叉搜索树的后序遍历序列(递归分治+辅助单调栈)

二叉搜索树的后序遍历序列(中等)

2020年9月1日

题目来源:力扣
在这里插入图片描述

解题
二叉搜索树的性质就是左子树比根节点小,右子树比根节点大。

二叉搜索树的后序遍历,有个规律就是最后一个点必为根节点。

按照后序遍历,可按是否小于根节点分成两个子树,如果分出来的是多个子树,则说明不符合二叉搜索树了。

参考自路飞大佬的题解

  • 递归分治
class Solution {
    public boolean verifyPostorder(int[] postorder) {
        return recur(postorder,0,postorder.length-1);
    }
    private boolean recur(int[] postorder,int l,int r){
        if(l>=r) return true;
        int tmp=l;
        //循环找出第一个比根节点大的数,以此拆分成左右两子树
        while(postorder[tmp]<postorder[r]){
            tmp++;
        }
        int center=tmp;
        //继续给tmp累加值
        while(postorder[tmp]>postorder[r]){
            tmp++;
        } 
        //首先判断tmp能否走到末尾,不能走到末尾则说明出现多个子树,为false
        return tmp==r && recur(postorder,l,center-1) && recur(postorder,center,r-1);
    }
}

在这里插入图片描述

  • 辅助单调栈
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--){
            int tmp=postorder[i];
            //当递减时,数值必须满足小于根节点这个规律,否则不是二叉搜索树
            if(tmp>root) return false;
            //当不为空的时候,且栈顶元素比当前数值大,说明开始递减
            while(!stack.isEmpty()&&stack.peek()>tmp){
                //更新root到仅比当前数值大
                root=stack.pop();
            }
            stack.add(tmp);
        }
        return true;
    }
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值