包含min函数的栈、栈的压入弹出序列、从上往下打印二叉树、二叉搜索树的后序遍历序列
创始人
2024-04-13 04:05:08
0

文章目录

  • 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 data_stack;stack 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 pushV,vector popV) {int pushi= 0, popj = 0;stack 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 PrintFromTopToBottom(TreeNode* root) {vector result;if(root == nullptr)return result;queue 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& 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 sequence) {if(sequence.empty())return false;return _VerifySquenceOfBST(sequence, 0, sequence.size() - 1);}
};

相关内容

热门资讯

国家发展改革委 财政部关于20... 国家发展改革委财政部关于2026年实施大规模设备更新和消费品以旧换新政策的通知 发改环资〔2025〕...
每周股票复盘:富奥股份(000... 截至2025年12月26日收盘,富奥股份(000030)报收于5.76元,较上周的5.71元上涨0....
每周股票复盘:上海能源(600... 截至2025年12月26日收盘,上海能源(600508)报收于12.09元,较上周的12.12元下跌...
每周股票复盘:东风科技(600... 截至2025年12月26日收盘,东风科技(600081)报收于11.78元,较上周的11.84元下跌...
每周股票复盘:国中水务(600... 截至2025年12月26日收盘,国中水务(600187)报收于2.59元,较上周的2.68元下跌3....
每周股票复盘:ST信通(600... 截至2025年12月26日收盘,ST信通(600289)报收于6.71元,较上周的6.93元下跌3....
每周股票复盘:恒誉环保(688... 截至2025年12月26日收盘,恒誉环保(688309)报收于23.28元,较上周的23.58元下跌...
每周股票复盘:广汽集团(601... 截至2025年12月26日收盘,广汽集团(601238)报收于8.15元,较上周的8.23元下跌0....
每周股票复盘:*ST新潮(60... 截至2025年12月26日收盘,*ST新潮(600777)报收于3.88元,较上周的3.85元上涨0...
每周股票复盘:郴电国际(600... 截至2025年12月26日收盘,郴电国际(600969)报收于9.72元,较上周的9.79元下跌0....