包含min函数的栈、栈的压入弹出序列、从上往下打印二叉树、二叉搜索树的后序遍历序列

news2024/10/6 5:07:01

文章目录

  • 1、包含min函数的栈
  • 2、栈的压入弹出序列
  • 3、从上往下打印二叉树
  • 4、二叉搜索树的后序遍历序列

1、包含min函数的栈

本题考点: 栈的规则性设计 牛客链接

题目描述:
定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的 min 函数,输入操作时保证 pop、top 和 min 函数操作时,栈中一定有元素。

此栈包含的方法有:
push(value):将value压入栈中
pop():弹出栈顶元素
top():获取栈顶元素
min():获取栈中最小元素

数据范围:操作数量满足0≤n≤300 ,输入的元素满足∣val∣≤10000
进阶:栈的各个操作的时间复杂度是O(1) ,空间复杂度是O(n)

解题思路:

在这里插入图片描述

代码:

class Solution {
private:
    stack<int> data_stack;
    stack<int> min_stack;
public:
    void push(int value) {
        data_stack.push(value);
        if(min_stack.empty() || value < min_stack.top())
        {
            min_stack.push(value);
        }
        else // !min_stack.empty() && value >= min_stack.top()
        {
            min_stack.push(min_stack.top());
        }
    }
    void pop() {
        data_stack.pop();
        min_stack.pop();
    }
    int top() {
        return data_stack.top();
    }
    int min() {
        return min_stack.top();
    }
};

2、栈的压入弹出序列

本题考点: 栈的理解 牛客链接

题目描述:
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。

  1. 0<=pushV.length == popV.length <=1000
  2. -1000<=pushV[i]<=1000
  3. pushV 的所有数字均不相同

解题思路:

在这里插入图片描述

代码:

class Solution {
public:
    bool IsPopOrder(vector<int> pushV,vector<int> popV) {
        
        int pushi= 0, popj = 0;
        stack<int> st;
        while(pushi < pushV.size()) 
        {
            st.push(pushV[pushi++]);
            while(!st.empty() && st.top() == popV[popj])
            {
                st.pop();
                popj++;
            }  
        }
        return st.empty();
        //return pushi == pushV.size();
    }
};

3、从上往下打印二叉树

本题考点: 二叉树层序遍历 牛客链接

题目描述:
不分行从上往下打印出二叉树的每个节点,同层节点从左至右打印。例如输入{8,6,10,#,#,2,1},如以下图中的示例二叉树,则依次打印8,6,10,2,1(空节点不打印,跳过),请你将打印的结果存放到一个数组里面,返回。
数据范围:
0<=节点总数<=1000
-1000<=节点值<=1000
在这里插入图片描述
解题思路:

在这里插入图片描述

代码:

class Solution {
public:
    vector<int> PrintFromTopToBottom(TreeNode* root) {
		vector<int> result;
		if(root == nullptr)
			return result;

		queue<TreeNode*> qe;
		qe.push(root);
		while(!qe.empty())
		{
			TreeNode* front = qe.front();
			qe.pop();
			result.push_back(front->val);

			if(front->left != nullptr) //左子树不为空将左子树入队列
				qe.push(front->left);
			if(front->right != nullptr)//右子树不为空将右子树入队列
				qe.push(front->right);
		}
		return result;
    }
};

4、二叉搜索树的后序遍历序列

本题考点: BST特征的理解 牛客链接

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

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

提示:
1.二叉搜索树是指父亲节点大于左子树中的全部节点,但是小于右子树中的全部节点的树。
2.该题我们约定空树不是二叉搜索树
3.后序遍历是指按照 “左子树-右子树-根节点” 的顺序遍历

解题思路:

  • 二叉搜索树:它或者是一棵空树,或者是具有下列性质的二叉树:若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;

  • 后序遍历:先左后右再根

  • BST的后序序列的合法序列是,对于一个序列S,最后一个元素是x(也就是root节点),如果去掉最后一个元素的序列为T,那么T满足:T可以分成两段,前一段(左子树)小于x,后一段(右子树)大于x,且这两段(子树)都是合法的后序序列

  • 验证思路就是:当前序列,及其子序列必须都满足上述定义

在这里插入图片描述

代码:

class Solution {
public:

    bool _VerifySquenceOfBST(vector<int>& v, int begin, int end)
    {

        //返回条件
        if(begin >= end)
        {
            //区间是在不断缩小到,走到这里说明之前的范围满足检测条件
            return true;
        }
        
        //判断逻辑
        int root = v[end];
        int i = begin;
        while(i < end && v[i] < v[end])
        {
            i++;
        }
        for(int j = i; j < end; j++)
        {
            if(v[j] < v[end])
                return false;
        }

        return _VerifySquenceOfBST(v, begin, i - 1) && _VerifySquenceOfBST(v, i, end - 1);
    }
    bool VerifySquenceOfBST(vector<int> sequence) {
        if(sequence.empty())
            return false;
        
        return _VerifySquenceOfBST(sequence, 0, sequence.size() - 1);
    }
};

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

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

相关文章

python之函数返回值传参Lambda表达式

目录 一、函数 函数与方法的区别 二、 函数返回值 三、函数传参 四、lambda表达式 一、函数 函数与方法的区别 直接调用的是函数 通过对象点出来的是方法 print("hello") a [2, 1, 3] # 对象 a.sort() print(a) 二、 函数返回值 # 返回值 def sum(*ar…

云服务器最佳实践-Linux云服务器SSH登录的安全加固

Linux云服务器常用的登录方式是SSH&#xff0c;对于密码登录方式创建的云服务器&#xff0c;如何保证登录安全性呢&#xff1f;本文以CentOS 7.6为例&#xff0c;对SSH登录进行安全加固。 修改默认端口 1、通过SSH密码方式远程登录云服务器。 2、执行以下命令&#xff0c;修改…

4-Arm PEG-N3,4-Arm PEG-Azide,四臂-聚乙二醇-叠氮一种多臂PEG衍生物

4-Arm PEG-Azide&#xff08;4-Arm PEG-N3&#xff09;一种多臂PEG衍生物&#xff0c;中文名为四臂-聚乙二醇-叠氮&#xff0c;它所属分类为Azide PEG Multi-arm PEGs。 该多臂peg衍生物的分子量均可定制&#xff1a;四臂-PEG 2000-叠氮、4-Arm PEG-N3 20000、四臂-peg 1000-叠…

linux常用服务配置、网络配置 和 基于FTP的上传和下载的几种方式

一. 网络服务配置 1. 主机名配置 hostname&#xff1a; 查看主机名 hostname xxx&#xff1a; 修改主机名(重启后无效) PS: 如果想要永久生效&#xff0c;可以修改/etc/sysconfig/network文件 2. 静态IP的配置 (1). 查看ip地址 &#xff1a; ifconfig (2). 临时修改ip地址&…

OpenCV实现文档自动矫正(含源码和测试数据)

OpenCV实现文档自动矫正&#xff08;含源码和测试数据&#xff09; 目录 OpenCV实现文档自动矫正 1. OpenCV文档矫正的方法 &#xff08;1&#xff09;基于霍夫变换的文档矫正方法 &#xff08;2&#xff09;基于透视变换的文档矫正方法 2. OpenCV文档自动矫正实现 &…

【Linux系统】第二篇、权限管理篇

文章目录一、Linux下的用户二、文件的权限1. 文件访问者的分类2. 文件类型和访问权限3. 文件权限值的表示方法三、文件访问权限的相关设置方法1. chmod2. chown3. chgrp4. umask&#xff08;重点&#xff09;四、file指令五、目录的权限粘滞位一、Linux下的用户 这里我们在上一…

从 12K 到 60K, 这 2023Java 研发必问高级面试题,过关斩将拿 offer

前言 学习某一门技术或者框架的时候&#xff0c;第一步当然是要了解下面这几样东西。 是什么&#xff1f; 有哪些特点&#xff1f; 有哪些应用场景&#xff1f; 有哪些成功使用的案例&#xff1f; … 为了让你更好地了解 Netty 以及它诞生的原因&#xff0c;先从传统的网…

R语言中实现马尔可夫链蒙特卡罗MCMC模型

什么是MCMC&#xff0c;什么时候使用它&#xff1f; MCMC只是一个从分布抽样的算法。 这只是众多算法之一。这个术语代表“马尔可夫链蒙特卡洛”&#xff0c;因为它是一种使用“马尔可夫链”&#xff08;我们将在后面讨论&#xff09;的“蒙特卡罗”&#xff08;即随机&#…

区间信息维护与查询【树状数组 】 - 原理1 一维树状数组

区间信息维护与查询【树状数组 】 - 原理1 一维树状数组 【原理1】 一维树状数组 有一个包含n 个数的数列2, 7, 1, 12, 5, 9 …&#xff0c;请计算前i 个数的和值&#xff0c;即前缀和sum[i ]a [1]a [2]…a [i ]&#xff08;i 1, 2, …, n&#xff09;。该怎么计算呢&#xf…

RISC-V入门(基础概念+汇编部分) 基于 汪辰老师的视频笔记

RISC-V入门 [完结] 循序渐进&#xff0c;学习开发一个RISC-V上的操作系统 - 汪辰 - 2021春 RISC-V 部分作业答案 参考 RISC-V ISA 基本介绍 历史简介 自由&#xff08;Free&#xff09;与开放&#xff08;Open&#xff09; RISC-V 念作 “risk-five”&#xff0c;代表着Berke…

JSON.stringify() / JSON.parse() / JSON 真是个好东西

目录 1. JSON 基本概念 1.1 JavaScript 对象表示法 1.2 JSON 文件 1.3 JSON 语法 2. XML VS JSON 2.1 共同点 2.2 不同点 2.3 使用步骤对比 3. JSON.parse() 3.1 使用介绍 3.2 使用 reviver 参数&#xff0c;将 JSON 对象解析出来的 string 转化为 Date 4. JSON.st…

【ML特征工程】第 4 章 :特征缩放的影响:从词袋到 Tf-Idf

&#x1f50e;大家好&#xff0c;我是Sonhhxg_柒&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流&#x1f50e; &#x1f4dd;个人主页&#xff0d;Sonhhxg_柒的博客_CSDN博客 &#x1f4c3; &#x1f381;欢迎各位→点赞…

【知识网络分析】耦合网络(bibliographic coupling)

耦合网络(bibliographic coupling) 1 读取本地文献并构建耦合网络数据集2 网络数据集精简3 中心点附近网络子群绘制4 求解网络图中节点中心度相关指标数值1 读取本地文献并构建耦合网络数据集 新建一个notebook文件,第一步导入功能包和数据集,案例中仍使用2020-2021年WOS数…

第八章《Java高级语法》第2节:补码

在Java语言中,使用补码的形式来表示数字。补码是计算机表示数字的一种规则或者是表示形式,它的算法很简单:用最左边的一个二进制位表示数字的正负,0表示正数,用1表示负数,专业上把表示符号的这个二进制位叫做“符号位”。符号位后面剩余的二进制位表示数字本身。 对于正…

PyQt5 QWebEngineView网页交互

QWebEngineView网页交互QWebEngineView常用方法加载并显示外部的Web页面加载并显示本地的Web页面加载并显示嵌入的HTML代码QWebEngineView常用方法 方法描述load(QUrl url)加载指定的URL并显示setHtml(QString &html)将网页视图的内容设置为指定的HTML内容 核心代码&#…

chapter2——时钟和复位

目录1.同步设计2.推荐的设计技术3.时钟方案4.门控时钟方法学5.复位信号的设计策略6.控制时钟偏移1.同步设计 在同步设计中由单个主时钟和单个主置位/复位信号驱动设计中所有的时序器件&#xff0c;对于ASIC的时钟域控制最安全的方法就是同步设计。 避免使用行波计数器 由于第…

Python 实现自动化测试 dubbo 协议接口

前言 在工作或学习过程中&#xff0c;可能会遇到后端服务里有使用 dubbo 协议实现的接口&#xff0c;dubbo 协议接口的测试方法不同于 http/https 类型的接口&#xff0c;不能简单使用request.post的方法来完成自动化测试。 如果需要对 dubbo 协议的接口进行自动化测试&#…

FFmpeg进阶:生成视频的缩略图

文章目录1.读取对应位置的视频帧2.添加时间信息3.对图像进行拼接4.输出拼接图像5.显示效果很多时候为了方便预览视频内容&#xff0c;我们会随机的抽取视频当中的一些帧组成一个图片作为视频的缩略图。这里介绍一下如何通过FFmpeg生成视频的缩略图。其实原理很简单&#xff0c;…

MyBatis association解决多对一和collection解决一对多的映射关系

多对一的映射关系 创建Emp和Dept类 1.处理多对一映射关系方式一&#xff1a;级联属性赋值 2.处理多对一映射关系方式二&#xff1a;association实现 association:处理多对一的映射关系 property:需要处理多对的映射关系的属性名 javaType:该属性的类型 3.处理多对一映射关…

Metabase学习教程:视图-6

表格视图几乎可以来做所有的事情 了解如何设置条件格式、小条形图、值格式等。 表格是数据的自然栖息地&#xff0c;对应关系数据库列和对应的行记录。它们可能不像条形图或者地图&#xff0c;但当你在很多领域工作时&#xff0c;它们往往是你所需要的。Metabase中的表可视化…