剑指Offer33.二叉搜索树的后序遍历序列 C++

1、题目描述

输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true,否则返回 false。假设输入的数组的任意两个数字都互不相同。
参考以下这颗二叉搜索树:
5
/
2 6
/
1 3
示例 1
输入: [1,6,3,2,5]
输出: false
示例 2
输入: [1,3,2,6,5]
输出: true

2、VS2019上运行

使用递归的方法

#include <iostream>
#include <vector>

using namespace std;

class Solution {
  public:
    bool VerifySquenceOfBST(vector<int>& p) {
        if (p.empty()) {//题目约定空树不是二叉树
            return false;
        }
        return helper(p, 0, p.size() - 1);
    }
    bool helper(vector<int>& p, int left, int right) {
        //并不是直接将空子树视为二叉搜索树,而是作为递归的终止条件之一
        if (left >= right) {
            return true;
        }
        //判断左子树是不是都比根节点小
        int pivot = left;//表示当前子树的左边界
        while (p[pivot] <p[right])  {//找到当前子树中第一个大于根节点值的元素的位置,将其作为划分点
            ++pivot;
        }
        //判断右子树是不是都比根节点大
        int mid = pivot; // 划分点
        while (p[pivot] > p[right]) {
            pivot++;
        }
        // 此时pivot应该指向右侧大于根节点的最右元素
        // 如果pivot不等于right,意味着划分点之后的一些元素小于根节点---不是二叉搜索树
        // 如果pivot等于right,意味着划分点之后的所有元素都大于根节点。
        // 递归检查左右子树,左子树和右子树必须都是有效的二叉搜索树
        return pivot == right && helper(p, left, mid - 1) && helper(p, mid, right - 1);
    }
};


int main() {
    vector<int> postorder = { 1, 3, 2, 6, 5 };
    Solution solution;
    bool isValidBST = solution.VerifySquenceOfBST(postorder);
    cout << "给定的后序遍历是有效的二叉搜索树吗?" << (isValidBST ? "是" : "否") << endl;
    return 0;
}

运行结果:
给定的后序遍历是有效的二叉搜索树吗?是

3、解题思路

二叉搜索树:左子树节点 < 根节点 < 右子树节点
中序遍历:左–根–右:所以中序遍历是单调递增
后序遍历:左->右->根
解题思路

  • 找根节点 在后续遍历中,最后一个节点一定是 根节点。
  • 找左/右集 在剩下的数组中,我们使用指针,在从头开始查找到 第一个大于根 的位置来做 左/右集的切割点。
  • 递归判断 左/右集的子集
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值