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

news/2024/11/17 5:47:39/

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 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、解题思路

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

  • 找根节点 在后续遍历中,最后一个节点一定是 根节点。
  • 找左/右集 在剩下的数组中,我们使用指针,在从头开始查找到 第一个大于根 的位置来做 左/右集的切割点。
  • 递归判断 左/右集的子集

http://www.ppmy.cn/news/1051257.html

相关文章

Python XML处理中级篇:深入探索lxml库

lxml库是Python中处理XML和HTML文档的强大库&#xff0c;提供了丰富的API以进行各种操作。在初级篇中&#xff0c;我们介绍了如何使用lxml库解析、访问和修改XML文档。在这篇中级篇中&#xff0c;我们将更深入地探讨如何使用lxml库&#xff0c;包括如何创建XML文档&#xff0c;…

如何区分线上支付和线下支付

线上支付和线下支付是根据支付场景和渠道进行区分的。以下是区分线上支付和线下支付的一些关键特征&#xff1a; 1. 场景和渠道&#xff1a; 线上支付&#xff1a;线上支付通常发生在互联网环境中&#xff0c;用户通过电子设备&#xff08;如电脑、手机、平板等&#xff09;进行…

Alibaba-Easyexcel 使用总结

简介 简介 EasyExcel 是一个基于 Java 的简单、省内存的读写 Excel 的开源项目&#xff0c;在尽可能节约内存的情况下支持读写百 M 的 Excel。 但注意&#xff0c;其不支持&#xff1a; 单个文件的并发写入、读取读取图片宏 常见问题 Excel 术语 Sheet&#xff0c;工作薄…

CST HFSS MATLAB参数方程定义曲面绘制

CST HFSS 函数定义曲面绘制 简介环境HFSSCSTMATLAB 简介 若在柱坐标系中半径r随z和phi都会变&#xff0c;无法使用一般的方法绘制&#xff0c;这时可以使用参数方程定义的曲面来绘制。举一个例子如下&#xff0c; r 100 0.5 ( c o s ( 0.2 ∗ p i ∗ z ) − 1 ) c o s ( φ …

Redis-设置密码linux服务器

操作步骤 打开Redis的配置文件&#xff0c;通常位于 /etc/redis/redis.conf。在配置文件中找到 #requirepass 或 requirepass 的行&#xff0c;如果存在的话&#xff0c;取消行首的注释符号 #。将密码设置为你想要的值&#xff0c;例如 requirepass YourPassword。确保将 Your…

vue下拉框赋值

另一个页面调用方法赋值 负责下拉框回显 methods: {// 按钮方法jieyue(row) {this.openDialog true;this.$nextTick(() > {this.$refs.testDialog.init(row);});},页面进入请求下拉框数据 // 窗口初始化方法&#xff0c;nextTick方法可以添加逻辑&#xff0c;如打开窗口时查…

解决Spring mvc + JDK17@Resource无法使用的情况

问题描述 我在使用jdk17进行Spring mvc开发时发现 Resource用不了了。 原因 因为JDK版本升级的改动&#xff0c;在Jdk9~17环境下&#xff0c;搭建Springboot项目&#xff0c;会出现原有Resource&#xff08;javax.annotation.Resource&#xff09;不存在的问题&#xff0c;导…

Day 56

Day 56 583. 两个字符串的删除操作 dp[i][j]&#xff1a;以i-1为结尾的字符串word1&#xff0c;和以j-1位结尾的字符串word2&#xff0c;想要达到相等&#xff0c;所需要删除元素的最少次数。 当word1[i - 1] 与 word2[j - 1]相同的时候,dp[i][j] dp[i - 1][j - 1];当word1…