剑指offer——JZ33 二叉搜索树的后序遍历序列 解题思路与具体代码【C++】

news2024/12/24 8:48:41

一、题目描述与要求

二叉搜索树的后序遍历序列_牛客题霸_牛客网 (nowcoder.com)

题目描述

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

数据范围: 节点数量 0≤n≤1000 ,节点上的值满足 1≤val≤105 ,保证节点上的值各不相同
要求:空间复杂度 O(n) ,时间时间复杂度 O(n2)

提示:

1.二叉搜索树是指父亲节点大于左子树中的全部节点,但是小于右子树中的全部节点的树。

2.该题我们约定空树不是二叉搜索树

3.后序遍历是指按照 “左子树-右子树-根节点” 的顺序遍历

4.参考下面的二叉搜索树,示例 1

示例

示例1:

输入:[1,3,2]

返回值:true

说明:是上图的后序遍历 ,返回true

示例2:

输入:[3,1,2]

返回值:false

说明:不属于上图的后序遍历,从另外的二叉搜索树也不能后序遍历出该序列 ,因为最后的2一定是根节点,前面一定是孩子节点,可能是左孩子,右孩子,根节点,也可能是全左孩子,根节点,也可能是全右孩子,根节点,但是[3,1,2]的组合都不能满足这些情况,故返回false

示例3:

输入:[5,7,6,9,11,10,8]

返回值:true


二、解题思路

根据题目描述我们需要根据所给出的后序遍历序列来判断其是否是一个二叉搜索树。【二叉搜索树的特性是,左子树都比根结点小,右子树都比根结点大】

后序遍历的结果是按照“左子树——右子树——根结点”遍历的。

这个题的解题思路在于怎么去判断左子树与右子树是否合理,也就是是否比根结点小/大。所以核心在于我们要以根结点为基准对这个序列进行判断。

因而我们可以将这个序列翻过来遍历,这样就成了“根结点——右子树——左子树”的顺序,我们从根节点开始将其压入栈,后面对序列进行遍历,在找到比根结点小的结点以前(也就是把右子树遍历完)把每个结点都入栈,一旦找到比当前根结点小的结点(代表开始遍历左子树),将栈顶弹出,更新root【一开始root是无穷大,这是为了遍历完右子树】,然后继续判断,直至将序列遍历完了,则返回true。一旦在遍历的过程中,在更新了root之后,发现有结点比根结点大(此时应该是左子树,应该比root小),则说明这颗树不符合二叉搜索树,返回false。

首先判断是否为空树,空树直接返回false;

然后初始化root为无穷大(作为是否遍历完右子树的标志);

然后对所给序列进行逆序遍历,每次循环都将当前结点与root进行比较(在root更新前,右子树还没遍历完,root更新后发现有未访问结点比root大则不符合二叉树性质);

然后判断栈是否为空并且栈顶元素是否大于当前结点(栈顶元素最开始是根结点,所以一旦找到比根结点小的结点,则说明右子树遍历完成,更新root,同时利用while循环出栈,一直到找到当前结点的父节点);

然后把当前元素压入栈中;

结束循环后返回true即可。


三、具体代码

#include <climits>
#include <cmath>
class Solution {
public:
    bool VerifySquenceOfBST(vector<int> sequence) {
        if(sequence.empty()) return false;//如果是空树则返回false
        stack<int> s;
        int root=INT_MAX;//初始化为最大值
        //对所给序列就进行逆序遍历,也就是变成根、右子树、左子树的顺序
        for(int i=sequence.size()-1;i>=0;i--){
            //右子树都遍历完后如果左子树的结点>root说明不是二叉搜索树
            if(sequence[i]>root) return false;
            //当栈不为空并且栈顶元素大于当前结点
            while(!s.empty()&&s.top()>sequence[i]){
                root=s.top();
                s.pop();//出栈
            }    
            //每个数字都进一次栈
            s.push(sequence[i]);
        }
        return true;
    }
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1066750.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

12P2532X162-233A KJ3222X1-BA1 CE4003S2B3 EMERSON CONTROLLER

12P2532X162-233A KJ3222X1-BA1 CE4003S2B3 EMERSON CONTROLLER EDGEBoost I/O模块是一种可扩展的模块化解决方案&#xff0c;集成到Premio的工业计算机中&#xff0c;通过即插即用的可扩展性提供增强的可靠性。这些附加模块有助于解决在加固边缘出现的设计限制和兼容性问题。…

VUE3技术报告

文章目录 node和webstorm基本概念1. Node.js2. npm3.Webpack4. Vue webstorm创建vue项目1. 通过npx create-vue创建vue项目2. 通过npx --package vue/cli vue创建vue项目 VUE3起步-创建应用-挂载应用1. createApp 创建函数&mount挂载应用2. 创建应用中的data选项3. methods…

Django实战项目-学习任务系统-用户登录

第一步&#xff1a;先创建一个Django应用程序框架代码 1&#xff0c;先创建一个Django项目 django-admin startproject mysite将创建一个目录&#xff0c;其布局如下&#xff1a;mysite/manage.pymysite/__init__.pysettings.pyurls.pyasgi.pywsgi.py 2&#xff0c;再创建一个…

实时监视分析 IIS 日志

Microsoft IIS服务器&#xff0c;无论是Web还是FTP&#xff0c;对于企业来说都是必不可少的。但是&#xff0c;IT 安全管理员的工作并不止于部署 IIS 服务器&#xff0c;部署后&#xff0c;管理员必须采取安全措施来保护这些服务器&#xff0c;监视 IIS 服务器安全性的一种行之…

免杀对抗-反沙盒+反调试

反VT-沙盒检测-Go&Python 介绍&#xff1a; 近年来&#xff0c;各类恶意软件层出不穷&#xff0c;反病毒软件也更新了各种检测方案以提高检率。 其中比较有效的方案是动态沙箱检测技术&#xff0c;即通过在沙箱中运行程序并观察程序行为来判断程序是否为恶意程序。简单来说…

ubuntu 设置x11vnc服务

Ubuntu 18.04 设置x11vnc服务 自带的vino-server也可以用但是不好用&#xff0c;在ubuntu论坛上看见推荐的x11vnc&#xff08;ubuntu关于vnc的帮助页面&#xff09;&#xff0c;使用设置一下&#xff0c;结果发现有一些坑需要填&#xff0c;所以写下来方便下次使用 转载请说明…

<el-input> textarea文本域显示滚动条(超过高度就自动显示)+ <el-input >不能正常输入,输入了也不能删除的问题

需求&#xff1a;首先是给定高度&#xff0c;输入文本框要自适应这个高度。文本超出高度就会显示滚动条否则不显示。 <el-row class"textarea-row"><el-col :span"3" class"first-row-title">天气</el-col><el-col :span&…

外卖小程序源码vs定制开发:何时选择哪种方式?

在数字餐饮行业的蓬勃发展中&#xff0c;外卖应用程序已经成为餐厅和创业者的必备工具。然而&#xff0c;当涉及到开发外卖应用程序时&#xff0c;您会面临一个重要的决策&#xff1a;是使用外卖小程序源码还是进行定制开发&#xff1f;这两种方法各有优势和劣势&#xff0c;取…

这款可视化拖拽式低代码平台,真香!

目录 一、产品介绍 二、设计原理 三、界面展示 1、代码生成器 2、工作流程 3、门户设计 4、大屏设计 5、报表设计 6、第三方登录 7、多租户实现 8、分布式调度 9、消息中心 四、功能框架 我们在低代码领域探索了很多年&#xff0c;从2014 开始研发低代码前端渲染&#xff0c;从…

DRM全解析 —— CRTC详解(1)

本文参考以下博文&#xff1a; Linux内核4.14版本——drm框架分析(4)——crtc分析 特此致谢&#xff01; 1. 简介 CRTC实际上可以拆分为CRTC。CRT的中文意思是阴极摄像管&#xff0c;就是当初老电视上普遍使用的显像管&#xff08;老电视之所以都很厚&#xff0c;就是因为它…

初学者如何选择:前端开发还是后端开发?

#开发做前端好还是后端好【话题征文】# 作为一名有多年开发经验的过来人&#xff0c;我认为前端开发和后端开发都有其独特的魅力和挑战。下面我将就我的个人经历和观点来分享一些关于前端开发和后端开发的看法。 首先&#xff0c;让我们将编程世界的大城市比作前端开发和后端开…

微信小程序获取用户头像调整

微信小程序获取用户头像&#xff0c;由于用户隐私策略调整&#xff0c;腾讯对获取用户信息也进行了调整。 记录内容如下&#xff1a; 1 新方式 新的方式&#xff1a;当触发获取用户头像时&#xff0c;由用户选择头像图片&#xff0c;输入昵称。 具体代码如下&#xff0c;即&…

Mybatis-plus 使用

1. 注解使用 mybatis-plus提供了 TableName, TableId, TableField, TableLogic 四种注解&#xff0c;其含义分别为&#xff1a; TableName TableName("SPF_Require_Vehicle") 用于声明当前class所对应数据库中的表&#xff0c;如果class的名字和表的名字完全相同&…

基于SSM的宿舍管理系统(有报告)。Javaee项目。

演示视频&#xff1a; 基于SSM的宿舍管理系统&#xff08;有报告&#xff09;。Javaee项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通过Spring SpringMvc My…

面试高频手撕算法 - 背包问题2

目录 1. 完全背包 1.1 【模板】完全背包 1.2 零钱兑换 1.3 零钱兑换 II 1.4 完全平方数 2. 二维费用的背包问题 2.1 一和零 2.2 盈利计划 --- 如果背包问题原先没有基础的&#xff0c;建议先看上一篇博客 --- 面试高频手撕算法 - 01背包系列 1. 完全背包 1.1 【模板】…

天眼销|企业数据查询必备

首先&#xff0c;得介绍一下天眼销是一个什么样的平台&#xff0c;请往下看&#xff1a; 可能会有一些还是觉得懒得看&#xff0c;简单理解&#xff0c;它与我们熟知的某查查&#xff0c;天眼某相类似&#xff0c;有很多共同之处。比如&#xff1a;某查查的服务模式&#xff08…

数据结构与算法(七)--使用链表实现栈

一、前言 之前我们已经学习了链表的所有操作及其时间复杂度分析&#xff0c;我们可以了解到对于链表头的相关操作基本都是O(1)的&#xff0c;例如链表头增加、删除元素&#xff0c;查询元素等等。那我们其实有一个数据结构其实可以完美利用到这些操作的特点&#xff0c;都是在…

Idea升级版本后踩坑关于Local History

版本升级&#xff1a;IntelliJ IDEA 2022.1.2 (Ultimate Edition) Local History本地历史修改记录在idea升级后默认只保留 5天 以内的修改记录&#xff0c;导致时间过长的一些内容就自动被清除掉了。可通过File->Setting-Advanced Setting 进行修改。

数据结构——常见的十种排序算法

一、常见的十种排序算法&#xff1a; 冒泡排序、选择排序、插入排序、归并排序、快速排序、希尔排序、堆排序、计数排序、桶排序、基数排序 1.【知识框架】 补充&#xff1a; 内部排序&#xff1a;整个排序过程完全在内存中进行。 外部排序&#xff1a;由于待排序记录数据量太…

python进行接口自动化测试

一、接口自动化测试的流程 1、需求分析 1、1请求&#xff08;url,方法、数据&#xff09; 2、挑选需要做自动化测试的接口 3、设计自动化测试用例 4、搭建自动化测试环境 5、设计自动化执行框架&#xff08;报告、参数化、 用例执行框架&#xff09; 6、编写代码 7、执…