当前位置:网站首页>leetcode:255 验证前序遍历序列二叉搜索树
leetcode:255 验证前序遍历序列二叉搜索树
2022-08-04 14:31:00 【OceanStar的学习笔记】
题目来源
题目描述
给定一个整数数组,你需要验证它是否是一个二叉搜索树正确的先序遍历序列。
你可以假定该序列中的数都是不相同的。
参考以下这颗二叉搜索树:

示例 1:
输入: [5,2,6,1,3]
输出: false
示例 2:
输入: [5,2,1,3,6]
输出: true
题目解析
思路
- 二叉搜索树的特点是: 左子树的值 < 根节点的值 < 右子树的值
- 所以其中序遍历一定是有序数组,但是前序遍历有什么规律呢?其前序遍历的数组是局部递减,整体递增的数组
- 所以可以借助单调栈
- 先设一个最小值 low,然后遍历数组,如果当前值小于这个最小值 low,返回 false
- 对于根节点,将其压入栈中,然后往后遍历
- 如果遇到的数字比栈顶元素小,说明是其左子树的点,继续压入栈中
- 直到遇到的数字比栈顶元素大,那么就是右边的值了。需要找到是哪个节点的右子树,所以更新 low 值并删掉栈顶元素,然后继续和下一个栈顶元素比较,如果还是大于,则继续更新 low 值和删掉栈顶,直到栈为空或者当前栈顶元素大于当前值停止,压入当前值
- 这样如果遍历完整个数组之前都没有返回 false 的话,最后返回 true 即可

class Solution {
public:
bool verifyPreorder(vector<int>& preorder) {
if(preorder.size() <= 2) return true;
int MIN = INT32_MIN;
stack<int> s;
for(int i = 0; i < preorder.size(); ++i)
{
if(preorder[i] < MIN)
return false;
while(!s.empty() && s.top() < preorder[i])//遇到大的了,右分支
{
MIN = s.top();//记录弹栈的栈顶为最小值
s.pop();
}
s.push(preorder[i]);
}
return true;
}
};
进阶要求
为了使空间复杂度为常量,我们不能使用 stack,所以直接修改 preorder,将 low 值存在 preorder 的特定位置即可
class Solution {
public:
bool verifyPreorder(vector<int>& preorder) {
int low = INT_MIN, i = -1;
for (auto a : preorder) {
if (a < low) return false;
while (i >= 0 && a > preorder[i]) {
low = preorder[i--];
}
preorder[++i] = a;
}
return true;
}
};
分治法
- 在递归函数中维护一个下界 lower 和上界 upper,那么当前遍历到的节点必须在(low, upper)之间
- 然后在给定区间内搜索第一个>=当前值的点,以此为分界点,左右两边分别调用递归函数。注意左半部分的 upper 更新为当前节点值 val,表明左子树的节点值都必须小于当前节点值,而右半部分的递归的 lower 更新为当前节点值 val,表明右子树的节点值都必须大于当前节点值
- 如果左右两部分的返回结果均为真,则整体返回真
class Solution {
public:
bool verifyPreorder(vector<int>& preorder) {
return helper(preorder, 0, preorder.size() - 1, INT_MIN, INT_MAX);
}
bool helper(vector<int>& preorder, int start, int end, int lower, int upper) {
if (start > end) return true;
int val = preorder[start], i = 0;
if (val <= lower || val >= upper) return false;
for (i = start + 1; i <= end; ++i) {
if (preorder[i] >= val) break;
}
return helper(preorder, start + 1, i - 1, lower, val) && helper(preorder, i, end, val, upper);
}
};
边栏推荐
- RS|哨兵二号(.SAFE格式)转tif格式
- 基于 Next.js实现在线Excel
- NPDP|作为产品经理,如何快速提升自身业务素养?
- Crawler - basic use of selenium, no interface browser, other uses of selenium, cookies of selenium, crawler cases
- 开发者独立搭建一个跨模态搜索应用有多难?
- Kyushu Cloud attended the Navigator Online Forum to discuss the current status, challenges and future of 5G MEC edge computing
- 爬虫——动作链、xpath、打码平台使用
- eyb:JWT介绍
- 【HMS core】【Media】【视频编辑服务】 在线素材无法展示,一直Loading状态或是网络异常
- 快解析结合友加畅捷U+
猜你喜欢

物联网应用发展趋势

Google plug-in. Download contents file is automatically deleted after solution
将 Sentinel 熔断限流规则持久化到 Nacos 配置中心

量化细胞内的信息流:机器学习时代下的研究进展

《中国综合算力指数》《中国算力白皮书》《中国存力白皮书》《中国运力白皮书》在首届算力大会上重磅发出

Technology sharing | Mini program realizes audio and video calls

【剑指offer33】二叉搜索树的后序遍历序列

零基础可以转行软件测试吗 ?这篇文章告诉你

Analysis and application of portrait segmentation technology

Win11勒索软件防护怎么打开?Win11安全中心勒索软件防护如何设置
随机推荐
小 P 周刊 Vol.13
[Opportunity Enlightenment-60]: "Soldiers, Stupid Ways"-1- Opening: "Death" and "Life" are the way of heaven
电子行业MES管理系统有哪些特殊功能
ICML 2022 | 图神经网络的局部增强
手搓一个“七夕限定”,用3D Engine 5分钟实现烟花绽放效果
Sum of four squares, laser bombs
Workaround without Project Facets
C# 复制列表
Notes for xpath getting node with namespace
[深入研究4G/5G/6G专题-50]: URLLC-16-《3GPP URLLC相关协议、规范、技术原理深度解读》-10-高可靠性技术-1-低编码率编码调制方案MCS与高可靠性DRB
技术分享| 小程序实现音视频通话
如何在ubuntu环境下安装postgresql并配置远程访问
阴影初始化【5】
[Problem solving] QT update component appears "To continue this operation, at least one valid and enabled repository is required"
开发者独立搭建一个跨模态搜索应用有多难?
郑轻新生校赛和中工选拔赛题解
解题-->在线OJ(十八)
2042. 检查句子中的数字是否递增-力扣双百代码-设置前置数据
实际工作中的高级技术(训练加速、推理加速、深度学习自适应、对抗神经网络)
CCF GLCC officially opened | Kyushu Cloud open source experts bring generous bonuses to help universities promote open source