缩点法验证二叉树的前序序列化

  • 题目
  • 解决思路
  • 代码
  • 说明

题目

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

(3)例如,上面的二叉树可以被序列化为字符串 “9,3,4,#,#,1,#,#,2,#,6,#,#”,其中 # 代表一个空节点。
(4)给定一串以逗号分隔的序列,验证它是否是正确的二叉树的前序序列化。编写一个在不重构树的条件下的可行算法。
(5)每个以逗号分隔的字符或为一个整数或为一个表示 null 指针的 ‘#’ 。
(6)你可以认为输入格式总是有效的,例如它永远不会包含两个连续的逗号,比如 “1,3” 。

解决思路

  • 题意解析:题意即判断输入的字符串是否为一颗二叉树的前序遍历序列。
  • 思路:解题核心是进行缩点,即将3个点压缩为1个点。若一个字符串最终能缩成一个点,且该点的值为“#”,则给定的字符串是一棵二叉树的前序遍历序列。
  • 具体步骤如下:

代码

  • C++代码
# include <stdio.h>
# include <string>
# include <vector>using namespace std;class Solution {public:bool isValidSerialization(string preorder) {vector<string> tmp;     // 用数组模拟栈,保存去掉逗号后的字符串。// 遍历字符串,并用 j 记录逗号的下标。for (int i = 0, j = 0; i < preorder.size(); i = j + 1) {j = i;while (j < preorder.size() && ',' != preorder[j]) {j++;}// 去除逗号,根据逗号的位置截取子串。tmp.push_back(preorder.substr(i, j - i));// 进行缩点,将3个点缩为1个点,如可以将4,#,#缩为一个#。则将3个点缩为了1个点。int last = tmp.size() - 1;while (tmp.size() >= 3 && "#" == tmp[last] && "#" == tmp[last - 1] && "#" != tmp[last - 2]) {tmp[last - 2] = "#";tmp.pop_back();     // 去掉tmp[last]位置的“#”tmp.pop_back();     // 去掉s[last-1]位置的“#”last = tmp.size() - 1;}}// 当最后栈中只有一个元素,且该元素为“#”时,说明原字符串是一个二叉树前序序列。return 1 == tmp.size() && "#" == tmp[0];}
};int main() {string preorder = "9,3,4,#,#,1,#,#,2,#,6,#,#";Solution *solution = new Solution();printf("%d\n", solution->isValidSerialization(preorder));return 0;
}
  • Python代码
# -*- coding: utf-8 -*-from typing import Listclass Solution:def __init__(self):passdef isValidSerialization(self, preorder: str) -> bool:tmp: List[str] = []  # 用数组模拟栈,保存去掉逗号后的字符串。preorder = preorder.split(',')  # 使用逗号进行分割for s in preorder:tmp.append(s)# 进行缩点,将3个点缩为1个点,如可以将4,#,#缩为一个#。则将3个点缩为了1个点。while len(tmp) >= 3 and "#" == tmp[-1] and "#" == tmp[-2] and "#" != tmp[-3]:tmp[-3] = "#"tmp.pop()  # 去掉tmp[-1]位置的“#”tmp.pop()  # 去掉s[-2]位置的“#”# 当最后栈中只有一个元素,且该元素为“#”时,说明原字符串是一个二叉树前序序列。return 1 == len(tmp) and "#" == tmp[0]def main():solution = Solution()preorder: str = "9,3,4,#,#,1,#,#,2,#,6,#,#"print(solution.isValidSerialization(preorder))if __name__ == "__main__":main()

说明

  • 对应LeetCode第331题。
  • 链接:https://leetcode-cn.com/problems/verify-preorder-serialization-of-a-binary-tree/

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

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

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

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

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

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

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

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

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

  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. python实现文件下载-Python实现HTTP协议下的文件下载方法总结
  3. 为什么装了ACDSEE 就不能点网站上的连接?
  4. 使用自定义断言丰富测试代码
  5. docker run
  6. C语言中指针的基类型,c – 将指针从一种基类型转换为另一种基类型
  7. 编程修养 阅读笔记四
  8. RHEL6入门系列之三,GNU计划与Linux发行版
  9. Android开发过程为C文件或者C++文件配置打印Logcat信息
  10. android反调试之父子调试
  11. 网络安全工程考试大纲
  12. 一文搞定权限管理!授权、鉴权超详细解析
  13. ng-template、ng-content、ng-container
  14. Dfinity(ICP)基础开发教程-5
  15. version magic ‘5.15.0 SMP mod_unload aarch64‘ should be ‘5.15.0-xilinx-v2022.2 SMP mod_unload aarch6
  16. isotope神奇的动态布局库
  17. 一文了解OpenAi的发展历史
  18. 用技巧] Http请求偶尔超时+总结各种超时死掉的可能和相应的解决办法
  19. 八十年代的程序员们和略显悲情的故事
  20. niuke题霸 SQL篇

热门文章

  1. php begintransaction,PDO::beginTransaction用法详解
  2. 快速排序时间复杂度数学证明
  3. iOS面试 swift篇
  4. 【毕设资料】 Web版RSS阅读器(一)——dom4j读取xml(opml)文件
  5. 亲密关系沟通-【认识需求】找到长期沟通的主方向
  6. 巴特沃斯(Butterworth)滤波器(二)
  7. stm32毕业设计 单片机车牌识别系统
  8. Oracle Coherence中文教程十二:配置高速缓存
  9. linux 日期、星期简写
  10. 微信java精简版低内存_微信精简版apk下载-微信精简版低内存2016 安卓版_5577安卓网...