331. 验证二叉树的前序序列化

难度中等376

序列化二叉树的一种方法是使用 前序遍历 。当我们遇到一个非空节点时,我们可以记录下这个节点的值。如果它是一个空节点,我们可以使用一个标记值记录,例如 #

例如,上面的二叉树可以被序列化为字符串 "9,3,4,#,#,1,#,#,2,#,6,#,#",其中 # 代表一个空节点。

给定一串以逗号分隔的序列,验证它是否是正确的二叉树的前序序列化。编写一个在不重构树的条件下的可行算法。

保证 每个以逗号分隔的字符或为一个整数或为一个表示 null 指针的 '#' 。

你可以认为输入格式总是有效的

  • 例如它永远不会包含两个连续的逗号,比如 "1,,3" 。

注意:不允许重建树。

示例 1:

输入: preorder = "9,3,4,#,#,1,#,#,2,#,6,#,#"
输出: true

示例 2:

输入: preorder = "1,#"
输出: false

示例 3:

输入: preorder = "9,#,#,1"
输出: false

提示:

  • 1 <= preorder.length <= 104
  • preorder 由以逗号 “,” 分隔的 [0,100] 范围内的整数和 “#” 组成


我们可以定义一个概念,叫做槽位。一个槽位可以被看作「当前二叉树中正在等待被节点填充」的那些位置。

二叉树的建立也伴随着槽位数量的变化。每当遇到一个节点时:

如果遇到了空节点,则要消耗一个槽位;

如果遇到了非空节点,则除了消耗一个槽位外,还要再补充两个槽位。

此外,还需要将根节点作为特殊情况处理。

我们使用栈来维护槽位的变化。栈中的每个元素,代表了对应节点处剩余槽位的数量,而栈顶元素就对应着下一步可用的槽位数量。当遇到空节点时,仅将栈顶元素减 1;当遇到非空节点时,将栈顶元素减 1 后,再向栈中压入一个 2。无论何时,如果栈顶元素变为 0,就立刻将栈顶弹出。

遍历结束后,若栈为空,说明没有待填充的槽位,因此是一个合法序列;否则若栈不为空,则序列不合法。此外,在遍历的过程中,若槽位数量不足,则序列不合法。

class Solution {public boolean isValidSerialization(String preorder) {int n = preorder.length();int i = 0;Deque<Integer> stack = new LinkedList<Integer>();stack.push(1);while (i < n) {if (stack.isEmpty()) {return false;}if (preorder.charAt(i) == ',') {i++;} else if (preorder.charAt(i) == '#'){int top = stack.pop() - 1;if (top > 0) {stack.push(top);}i++;} else {// 读一个数字while (i < n && preorder.charAt(i) != ',') {i++;}int top = stack.pop() - 1;if (top > 0) {stack.push(top);}stack.push(2);}}return stack.isEmpty();}
}

复杂度分析

时间复杂度:O(n),其中 n为字符串的长度。我们每个字符只遍历一次,同时每个字符对应的操作都是常数时间的。

空间复杂度:O(n)。此为栈所需要使用的空间。

331. 验证二叉树的前序序列化相关推荐

  1. leetcode 331. 验证二叉树的前序序列化

    序列化二叉树的一种方法是使用前序遍历.当我们遇到一个非空节点时,我们可以记录下这个节点的值.如果它是一个空节点,我们可以使用一个标记值记录,例如 #._9_/ \3 2/ \ / \4 1 # 6 / ...

  2. leetcode 331. Verify Preorder Serialization of a Binary Tree | 331. 验证二叉树的前序序列化(栈解法)

    题目 https://leetcode.com/problems/verify-preorder-serialization-of-a-binary-tree/ 题解 看了答案,参考:拍案叫绝的两种解 ...

  3. LeetCode_Stack_331. Verify Preorder Serialization of a Binary Tree 验证二叉树的前序序列化(Java)【栈,字符串处理】

    目录 一,题目描述 英文描述 中文描述 示例与说明 二,解题思路 1,栈合并节点 2,计算入度出度和 三,AC代码 Java 栈 计算出入度 四,解题过程 第一博 第二搏 一,题目描述 英文描述 On ...

  4. leetcode算法题--验证二叉树的前序序列化

    题目链接:https://leetcode-cn.com/problems/verify-preorder-serialization-of-a-binary-tree/ 1.栈 bool isVal ...

  5. C/C++面试题—重建二叉树【前序 + 中序- 重建二叉树 和 后序 + 中序 - 重建二叉树】

    题目介绍 题目:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字. 例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{ ...

  6. 算法训练营 day20 二叉树 最大二叉树 合并二叉树 二叉搜索树中的搜索 验证二叉树

    算法训练营 day20 二叉树 最大二叉树 合并二叉树 二叉搜索树中的搜索 验证二叉树 最大二叉树 654. 最大二叉树 - 力扣(LeetCode) 给定一个不重复的整数数组 nums . 最大二叉 ...

  7. 二叉树的前序遍历,中序遍历,后序遍历-详解-配套例题

    二叉树作为数据结构中一种简单而且重要的数据结构,他的存储结构和算法都相对比较简单,因此他也显得特别重要,因为很多问题都可以抽象为二叉树的问题. 在这里我们对于二叉树的基本概念不做详细介绍,我们这里主要 ...

  8. 14 二叉树的前序遍历(Binary Tree Preorder Traversal)

    文章目录 1 题目 2 描述 3 解决方案 3.1 递归算法 3.1.1 遍历法(Traverse) 思路 源码 3.1.2 分治法(Devide And Conquer) 思路 源码 3.2 非递归 ...

  9. 二叉树的前序,中序,后序的递归、迭代实现

    二叉树的前序遍历 递归实现 递归实现没什么好说的.个人感觉将函数功能看成一个整体,不要去想栈中怎么实现的.毕竟自己的脑袋不是电脑,绕着绕着就蒙了. void preordered_traversal_ ...

  10. LeetCode:144_Binary Tree Preorder Traversal | 二叉树的前序遍历 | Medium

    题目:Binary Tree Preorder Traversal 二叉树的前序遍历,同样使用栈来解,代码如下: 1 struct TreeNode { 2 int val; 3 TreeNode* ...

最新文章

  1. 温度对结构光深度的影响
  2. 如何将django部署从顶级目录迁移到子目录下(NGINX UWSGI DJANGO)
  3. android组合动画还原,Android - Fragment,View动画,组合动画,属性动画
  4. Zabbix server is not running: the information displayed may not be current.
  5. 富人和穷人的八大差异
  6. vim上下左右键输出A B
  7. HTML5之美一 --- 转载
  8. BZOJ4401: 块的计数 思维题
  9. 【原理】 进程调度算法
  10. html5 预览dwg,哪个企业网盘可以实现dwg在线预览?
  11. LED背光源是什么,背光源LED是什么意思呢?
  12. 职业倾向测试脸型软件,气质类型测试适合职业
  13. win7 此计算机无法连接到家庭组,Win7旗舰版无法进入家庭组如何处理
  14. 【备忘】李炎恢老师HTML5+CSS3教程与课件代码【共享完毕】下载
  15. Contiki学习笔记——Cooja启动失败
  16. 高性能服务器设计[转自腾讯km,由qzhang同学翻译]
  17. 2021-6-8-今日收获
  18. sql/oracle数据库之取整函数round()、ceil()、floor()等等及示例
  19. 随机数——Random
  20. AES/ECB/PKCS7Padding 加密

热门文章

  1. WEB常见的HTTP错误代码404 500等
  2. 在精益(Lean)中对定理进行证明(第一章)
  3. 怎么避免后台被搜索_【干货】一文读懂360搜索oCPC
  4. Echarts绘制极坐标系下的多色柱状图
  5. php 上传图片 裁剪,thinkphp_图片上传裁剪功能
  6. youtube python 中文_GitHub - dousirui001/youtube-streaming-translator-python: 实时翻译油管直播,开发中...
  7. 企业微信跳转第三方APP
  8. 学习记录514@react使用antd选择器设置下拉菜单宽度
  9. python按顺序执行函数_Python3的unittest用例按编写顺序执行
  10. 基于单目视觉的平面目标定位和坐标测量 (上) - 坐标系和成像模型