文章目录

  • 1. 题目
  • 2. 解题
    • 2.1 递归超时解
    • 2.2 单调栈

1. 题目

给定一个整数数组,你需要验证它是否是一个二叉搜索树正确的先序遍历序列。

你可以假定该序列中的数都是不相同的。

参考以下这颗二叉搜索树:5/ \2   6/ \1   3
示例 1:
输入: [5,2,6,1,3]
输出: false示例 2:
输入: [5,2,1,3,6]
输出: true进阶挑战:
您能否使用恒定的空间复杂度来完成此题?

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/verify-preorder-sequence-in-binary-search-tree
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 解题

2.1 递归超时解

  • 检查左边小于root,右边是否都大于root,时间复杂度O(n2)
class Solution {public:bool verifyPreorder(vector<int>& preorder) {if(preorder.size() <= 2) return true;return check(preorder, preorder[0], 1, preorder.size()-1);}bool check(vector<int>& arr, int root, int l, int r){if(l>=r) return true;int split = l, i;while(split <= r && arr[split] < root)split++;//左边部分比我root小i = split;for(i = split; i <= r; ++i)if(arr[i] < root)//右边部分因该都比我大,此处复杂度较高return false;return check(arr, arr[l], l+1, split-1) && (split > r ||check(arr, arr[split], split+1, r));}
};

2.2 单调栈

class Solution {map<int,int> m;
public:bool verifyPreorder(vector<int>& preorder) {if(preorder.size() <= 2) return true;int MIN = INT_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;}
};

100 ms 21.5 MB


我的CSDN博客地址 https://michael.blog.csdn.net/

长按或扫码关注我的公众号(Michael阿明),一起加油、一起学习进步!

LeetCode 255. 验证前序遍历序列二叉搜索树(单调栈)*相关推荐

  1. 1008. 前序遍历构造二叉搜索树

    文章目录 1008. 前序遍历构造二叉搜索树 一.解题思路 特殊边界 二.使用单调栈优化 1008. 前序遍历构造二叉搜索树 给定一个整数数组,它表示BST(即 二叉搜索树 )的 先序遍历 ,构造树并 ...

  2. 快到十月份了希望到时候中期通过并拿到offer,恐惧又憧憬未来的小黑的leetcode之旅:1008. 前序遍历构造二叉搜索树 三轮面试通过。准备和老黑们和阿黄吃海底捞~

    小黑做法 # Definition for a binary tree node. # class TreeNode: # def __init__(self, val=0, left=None, r ...

  3. leetcode 1008. Construct Binary Search Tree from Preorder Traversal | 1008. 前序遍历构造二叉搜索树(Java)

    题目 https://leetcode.com/problems/construct-binary-search-tree-from-preorder-traversal/ 题解 好题. 我知道需要用 ...

  4. 【LeetCode】剑指 Offer 33. 二叉搜索树的后序遍历序列

    [LeetCode]剑指 Offer 33. 二叉搜索树的后序遍历序列 文章目录 [LeetCode]剑指 Offer 33. 二叉搜索树的后序遍历序列 package offer;public cl ...

  5. 【LeetCode】剑指 Offer 54. 二叉搜索树的第k大节点

    [LeetCode]剑指 Offer 54. 二叉搜索树的第k大节点 文章目录 [LeetCode]剑指 Offer 54. 二叉搜索树的第k大节点 一.中序遍历(提前返回) 一.中序遍历(提前返回) ...

  6. 中序遍历解决二叉搜索树问题

    中序遍历解决二叉搜索树问题 Python3 树 深度优先搜索 通过中序遍历二叉搜索树得到的关键码序列是一个递增序列. 这是二叉搜索树的一个重要性质,巧妙利用这一性质可以解决一系列二叉搜索树问题. 本系 ...

  7. 【LeetCode】剑指 Offer 36. 二叉搜索树与双向链表

    [LeetCode]剑指 Offer 36. 二叉搜索树与双向链表 文章目录 [LeetCode]剑指 Offer 36. 二叉搜索树与双向链表 package offer;//定义节点 class ...

  8. [Leetcode][第99题][JAVA][恢复二叉搜索树][中序遍历]

    [问题描述][困难] [解答思路] 1. 显示中序遍历 时间复杂度:O(N) 空间复杂度:O(N) class Solution {public void recoverTree(TreeNode r ...

  9. 【数据结构】树与树的表示、二叉树存储结构及其遍历、二叉搜索树、平衡二叉树、堆、哈夫曼树与哈夫曼编码、集合及其运算

    1.树与树的表示 什么是树? 客观世界中许多事物存在层次关系 人类社会家谱 社会组织结构 图书信息管理 分层次组织在管理上具有更高的效率! 数据管理的基本操作之一:查找(根据某个给定关键字K,从集合R ...

最新文章

  1. Java JTextArea参数介绍
  2. set/multiset/unordered_set和map/multimap/unordered_map基础汇总
  3. java的super_Java中this和super的用法总结
  4. 如何修改订单金额实现 0.01 元买 iPhone X?
  5. Windows下定时器与多线程的区别
  6. hive get_json_object json_tuple json解析详解
  7. linux性能监测工具
  8. 物联网监测之光纤振动传感器
  9. 《App 后台开发运维和架构实践》完整目录
  10. Android 应用内部打开PDF文件
  11. Heka采集系统Output插件开发
  12. 实验四+049+尤帆贤
  13. 集总参数电路抽象---线性电路叠加定理理解
  14. 【小样本基础】有监督小样本,半监督小样本,无监督小样本
  15. Pinbox 使用快捷键打开网页
  16. 图论 SCC(CCF高速公路)
  17. Java:如何选择一个好的Java外包合作伙伴?
  18. 我和ChatGPT pair 整理的测试类型清单
  19. RabbitMQ:The channelMax limit is reached. Try later.
  20. Python 抖音无水印视频下载

热门文章

  1. vue 鼠标点击事件_VBA代码解决方案第115讲:点击鼠标实现精准控制触发事件的VBA代码第二方案...
  2. linux servlet 乱码问题,Servlet一次乱码排查后的总结
  3. include包含头文件的语句中,双引号和尖括号的区别
  4. Mysql安装后在服务里找不到和服务启动不起来的解决方法
  5. innobackupex备份工具
  6. Angular CLI的简单使用(1)
  7. 生成 excel 直接用 httpServletResponse 输出
  8. 十大经典算法 - 转载
  9. [UWP]做个调皮的BusyIndicator
  10. 转!!ftp的主动模式(port)与被动模式(PASV)