【剑指offer】面试题33:二叉搜索树的后序遍历序列——递归实现

在这里插入图片描述

方法一:递归实现

我需要知道二叉搜索树的右边所有的节点都要比根节点大
左边的所有节点都比根节点小
1.给的后序遍历的最后一个节点是根节点
2.从左到右遍历序列,第一个比根节点大的节点后面都是右子树,前面都是左子树

class Solution {
public:
    bool verifyPostorder(vector<int>& postorder) {
        return helper( postorder, 0, postorder.size() - 1 );
    }

    bool helper( vector<int>& postorder, int left ,int right )
    {
        //因为是二叉搜索树,如果最左边的等于最右边的表示只有一个节点,如果left > right表示没有节点
        if( left >= right )
            return true;
        
        int mid = left;
        int root = postorder[right];
        while( postorder[mid] < root )
            mid++;

        //postorder[mid]前面的值都是比root根节点小的值,且为根节点的左子树
        //后面都是右子树,所以如果后面的比根节点要小,说明不是二叉搜索树,返回false
        int tempIndex = mid;
        while( tempIndex < right )
        {
            if( postorder[tempIndex++] < root )
                return false;
        }
        //然后对区分开的左右子树递归进行判断
        return helper( postorder, left, mid -1 ) && helper( postorder, mid, right - 1);

    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值