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

在这里插入图片描述

class Solution {
public:
    bool verifyPostorder(vector<int>& postorder) {
        // 后序遍历中倒数第一个结点为根节点root
        // 如果是二叉搜索树的后序(根据左小右大,并且后序先左后右)
        // 那么遍历结果存在一个拐点k,k之前都小于root,从k开始都大于root
        // 如果从k开始到root之前的结点,存在小于root的结点,那就返回false
        return dfs(postorder, 0, postorder.size()-1);
    }


    bool dfs(vector<int>& postorder, int l, int r){
        if(l>=r) return true;    // 只有一个结点返回true
        // 可以演绎一下[5,4,3,2,1] 没有左子树的情况,应该要返回true 
        // 拐k=0, 之后左子树[0, -1] 应该要返回true。如果返回false答案就错了


        int k = l;
        int root = postorder[r];  // 倒数第一个结点为根
        while(postorder[k]<root)  // 从第一个结点开始,找到拐点
            k++;
        
        // 此时postorder[k]>root,遍历完剩下的结点,检查是否有小于root的
        // 如果有,说明不满足,返回false
        for(int i=k; k<r; k++){
            if (postorder[k]<root)
                return false;
        }

        // 没有返回false说明该区间满足(k之前小,k之后大)
        // 但是我们要进一步检查左右子树是否也满足  左子树[l, k-1] 右子树[k+1, r]
        return dfs(postorder, l, k-1) && dfs(postorder, k+1, r);
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值