剑指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上运行

使用递归的方法

cpp 复制代码
#include <iostream>
#include <vector>

using namespace std;

class Solution {
public:
    bool verifyPostorder(vector<int>& postorder) {
        //划分点 pivot 等于右边界 right,并且左子树和右子树都是有效的二叉搜索树
        return helper(postorder, 0, postorder.size() - 1);
    }

private:
    bool helper(vector<int>& postorder, int left, int right) {
        // 基本情况:空子树或单个节点,也是一个二叉搜索树
        if (left >= right) {
            return true;
        }

        int pivot = left;//表示当前子树的左边界
        //找到当前子树中第一个大于根节点值的元素的位置,将其作为划分点
        while (postorder[pivot] < postorder[right]) {
            ++pivot;//表示划分节点的位置
        }
        int mid = pivot; // 划分点

        
        while (postorder[pivot] > postorder[right]) {
            ++pivot;
        }

        // 此时pivot应该指向右侧大于根节点的最右元素

        // 如果pivot不等于right,意味着划分点之后的一些元素小于根节点---不是二叉搜索树
        // 如果pivot等于right,意味着划分点之后的所有元素都大于根节点。

        // 递归检查左右子树,左子树和右子树必须都是有效的二叉搜索树
        return pivot == right && helper(postorder, left, mid - 1) && helper(postorder, mid, right - 1);
    }
};

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

运行结果:

给定的后序遍历是有效的二叉搜索树吗?是

3、解题思路

二叉搜索树:左子树节点 < 根节点 < 右子树节点

中序遍历:左--根--右:所以中序遍历是单调递增

后序遍历:左->右->根
解题思路

  • 找根节点 在后续遍历中,最后一个节点一定是 根节点。
  • 找左/右集 在剩下的数组中,我们使用指针,在从头开始查找到 第一个大于根 的位置来做 左/右集的切割点。
  • 递归判断 左/右集的子集
相关推荐
龙山云仓12 分钟前
No131:AI中国故事-对话荀子——性恶论与AI约束:礼法并用、化性起伪与算法治理
大数据·人工智能·深度学习·算法·机器学习
夏鹏今天学习了吗20 分钟前
【LeetCode热题100(90/100)】编辑距离
算法·leetcode·职场和发展
芒克芒克1 小时前
数组去重进阶:一次遍历实现最多保留指定个数重复元素(O(n)时间+O(1)空间)
数据结构·算法
星火开发设计1 小时前
二维数组:矩阵存储与多维数组的内存布局
开发语言·c++·人工智能·算法·矩阵·函数·知识
夜勤月1 小时前
彻底终结内存泄漏与悬挂指针:深度实战 C++ 智能指针底层原理与自定义内存池,打造稳如泰山的系统基石
开发语言·c++
Fcy6481 小时前
⽤哈希表封装unordered_map和unordered_set(C++模拟实现)
数据结构·c++·散列表
CSDN_RTKLIB1 小时前
右值引用一个误区
c++
丨康有为丨1 小时前
算法时间复杂度和空间复杂度
算法
HarmonLTS2 小时前
Python人工智能深度开发:技术体系、核心实践与工程化落地
开发语言·人工智能·python·算法
a程序小傲2 小时前
京东Java面试被问:RPC调用的熔断降级和自适应限流
java·开发语言·算法·面试·职场和发展·rpc·边缘计算