【C/C++】BST树的后序遍历

news/2024/7/9 3:12:57

题目描述:
给定一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true,否则返回 false。假设输入的数组的任意两个数字都互不相同。

参考以下这颗二叉搜索树:
     5
    / \
   2   6
  / \
 1   3

示例 1:

输入: [1,6,3,2,5]
输出: false

示例 2:

输入: [1,3,2,6,5]
输出: true

#include <iostream>
#include <vector>
using namespace std;

class Solution {
public:
    // 入口函数,判断输入的整数数组是否是某二叉搜索树的后序遍历结果
    bool verifyPostorder(vector<int>& postorder) {
        // 调用辅助函数 verifyPostorderHelper,传入整数数组、数组起始位置和结束位置
        return verifyPostorderHelper(postorder, 0, postorder.size() - 1);
    }
    
    // 辅助函数,用于递归检查数组是否满足二叉搜索树的后序遍历结果
    bool verifyPostorderHelper(vector<int>& postorder, int start, int end) {
        // 当起始位置大于等于结束位置时,表示只有一个节点或者空树,必然满足条件,返回 true
        if (start >= end) return true;
        
        // 获取根节点的值,根节点位于数组末尾
        int root = postorder[end];
        
        int i = start;
        // 在数组中找到左子树的区间,左子树的所有节点值都小于根节点
        while (postorder[i] < root) ++i;
        
        int j = i;
        // 在数组中找到右子树的区间,右子树的所有节点值都大于根节点
        while (postorder[j] > root) ++j;
        
        // 如果 j 不等于 end,说明右子树部分有小于根节点的值,不符合二叉搜索树的性质,返回 false
        if (j != end) return false;
        
        // 递归检查左右子树是否都满足二叉搜索树的后序遍历结果
        // 左子树的区间为 [start, i-1],右子树的区间为 [i, end-1]
        return verifyPostorderHelper(postorder, start, i - 1) && verifyPostorderHelper(postorder, i, end - 1);
    }
};

int main() {
    // 示例输入数据
    vector<int> postorder1 = {1, 6, 3, 2, 5};
    Solution sol;
    
    // 输出第一个示例的结果
    cout << "Example 1: " << boolalpha << sol.verifyPostorder(postorder1) << endl; // 输出 false
    
    // 示例输入数据
    vector<int> postorder2 = {1, 3, 2, 6, 5};
    
    // 输出第二个示例的结果
    cout << "Example 2: " << boolalpha << sol.verifyPostorder(postorder2) << endl; // 输出 true
    
    return 0;
}

http://lihuaxi.xjx100.cn/news/2142799.html

相关文章

UTF-8编码原理

UTF-8是目前使用最广泛的Unicode字符编码&#xff0c;本文顺着历史顺序讲解&#xff0c;来引出UTF8编码的来由和工作原理。 1. ASCII码 最开始是ASCII码&#xff0c;每个码位&#xff08;code point&#xff09;占1个字节&#xff0c;使用128个码位定义128个字符&#xff0c;…

前端跨页面通信方案介绍

在浏览器中&#xff0c;我们可以同时打开多个Tab页&#xff0c;每个Tab页可以粗略理解为一个“独立”的运行环境&#xff0c;即使是全局对象也不会在多个Tab间共享。然而有些时候&#xff0c;我们希望能在这些“独立”的Tab页面之间同步页面的数据、信息或状态。这就是本文说说…

代码随想录day41| 343. 整数拆分 、96.不同的二叉搜索树

343. 整数拆分 dp[i]&#xff1a;对i进行拆分&#xff0c;相乘得到的最大值dp[i] 递推公式&#xff1a; dp[i] max(dp[i], j * (i - j), j * dp[i - j]); 为什么还要dp[i[放进去比较&#xff1f; ——这其实是在不断更新dp[i]的值&#xff0c;不放进的话&#xff0c;原本的…

单机部署 MinIO

一、 创建目录 sudo mkdir -p /opt/minio/{bin,conf,data}二、下载MinIO二进制文件 cd /opt/minio/bin sudo wget https://dl.min.io/server/minio/release/linux-amd64/minio sudo chmod x minio三、添加配置文件 #sudo vim /opt/minio/conf/minio.conf#指定数据存储目录. …

ajax的优缺点有哪些?

我们先来介绍一下什么是ajax&#xff1a; 对于ajax的理解&#xff0c;ajax是一种使用现有技术集合技术内容包括: HTML或XHTML、CSS、 JavaScript、DOM、XML、 XSLT&#xff0c; 以及最重要的XMLHttpRequest。 用于浏览器与服务器之间使用异步数据传输(HTTP请求)&#xff0c;做…

SPAT Revolution 猫灯乐团的独特现场体验

声音工程师Johnny Torchy谈到使用SPAT Revolution进行WFS设置&#xff0c;以创造与The Neko Light Orchestra一起令人难忘和沉浸的独特现场体验。 音乐团体 Neko Light Orchestra 有一个举办马拉松比赛的想法。Neko Light 项目非常有趣&#xff0c;因为舞台上有多达 13 位音乐…

Java 分支结构 - if…else/switch

顺序结构只能顺序执行&#xff0c;不能进行判断和选择&#xff0c;因此需要分支结构。 Java有两种分支结构&#xff1a; if语句switch语句 if语句 一个if语句包含一个布尔表达式和一条或多条语句。 语法 If 语句的用语法如下&#xff1a; if(布尔表达式) {//如果布尔表达…

深入探索Android Studio中应用堆栈信息的查看与分析艺术

引言 在Android应用开发与调试过程中&#xff0c;正确且有效地查看和分析堆栈信息至关重要。堆栈信息记录了程序在执行过程中的调用路径&#xff0c;尤其在应用程序崩溃或异常发生时&#xff0c;它是诊断问题源头的重要线索。本文将详细介绍如何利用Android Studio这一强大的I…