验证二叉树的前序序列化

article/2025/6/24 6:58:53

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

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

题目

(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/

http://chatgpt.dhexx.cn/article/bYehOpE3.shtml

相关文章

验证二叉树的前序序列化Python解法

序列化二叉树的一种方法是使用 前序遍历 。当我们遇到一个非空节点时&#xff0c;我们可以记录下这个节点的值。如果它是一个空节点&#xff0c;我们可以使用一个标记值记录&#xff0c;例如 #。 例如&#xff0c;上面的二叉树可以被序列化为字符串 "9,3,4,#,#,1,#,#,2,#,…

7-1 前序序列创建二叉树

7-1 前序序列创建二叉树 编一个程序&#xff0c;读入用户输入的一串先序遍历字符串&#xff0c;根据此字符串建立一个二叉树&#xff08;以二叉链表存储&#xff09;。 例如如下的先序遍历字符串&#xff1a; ABC##DE#G##F### 其中“#”表示的是空格&#xff0c;代表一棵空树。…

超容易理解的数据结构前序,中序和后序序列

今天听了我们数据结构老师讲三序序列&#xff0c;发现有很多同学不能根据二叉树推&#xff0c;特发此文讲解。 对于三序序列&#xff0c;我们可以选择构造一个表格并创造一个指针&#xff0c;将指针指于二叉树根结点&#xff0c;对应表格则如下所示&#xff0c;若某节点无左孩…

IIC通信协议详解[转载]

IIC的基本介绍 IIC的简介 IIC&#xff08;Inter&#xff0d;Integrated Circuit&#xff09;总线是一种由PHILIPS公司在80年代开发的两线式串行总线&#xff0c;用于连接微控制器及其外围设备。它是半双工通信方式。 IIC总线最主要的优点是其简单性和有效性。由于接口直接在组件…

IIC通信协议学习

1.IIC简介 IIC&#xff1a;Inter-Integrated Circuit&#xff08;内部集成电路&#xff09; 需要两个管脚&#xff1a;SDA、SCL SPI协议&#xff1a;一个主设备对多个从设备&#xff0c;每增加一个从设备&#xff0c;需要增加一个端口CS* 特点&#xff1a;速度较快&#xff…

IIC总线设计①——IIC通信协议

目录 一、IIC&#xff08;Inter-Integrated Circuit&#xff09;总线介绍 二、IIC协议 &#xff08;一&#xff09;IIC通信过程 &#xff08;二&#xff09;起始信号和停止信号 程序 &#xff08;三&#xff09;应答信号和非应答信号 程序 &#xff08;四&#xff09;数…

STM32基于IIC通信协议的OLED模块使用(详解)

目录 前言 一、项目内容 实验简介 二、IIC模块 1、IIC协议简介 2、物理层 3、协议层 4、硬件IIC代码配置 5、软件模拟IIC配置 1、起始信号与停止信号 2、从机应答信号 3、数据的有效性 4、数据传输 三、OLED模块 1、软件配置 2、OLED原理 1、OLED初始化函数 …

IIC 通信协议 (一)

目录 引言 IIC协议 1、历史 2、特点 3、信号线 4、主从关系 5、通信过程 6、协议规范 地址 1、器件地址 2、存储器地址 读写时序 1、写时序 1.1、单字节写时序 1.2、连续写时序 2、读时序 2.1、单字节读时序 2.2、连续读时序 参考声明 引言 这个专栏闲置好…

基础通信协议之 IIC (I2C) 详细讲解

IIC是当今嵌入式应用中最常见的串行通信协议之一。对比OneWire严苛的时序要求&#xff0c;SPI等更多的线缆要求&#xff0c;IIC处于一个折中的位置&#xff1a;不那么多的2根线缆的硬件要求&#xff0c;不那么复杂严苛的时序要求&#xff0c;便可进行多主多从的双向通信&#x…

IIC 通信协议 (二)

目录 引言 子模块设计 思路 单字节 IIC 发送模块 思路 Verilog 源码 多字节发送控制模块 思路 Verilog 源码 仿真 思路 test bench 仿真结果 参考声明 引言 本篇博文承接前文&#xff0c;继续做 IIC 通信协议 FPGA实现相关的内容。用Verilog 编写一个 IIC 通信控…

IIC通信协议(硬件实现IIC通信详解I)

IIC通信协议 什么是IIC协议协议层起始信号和停止信号数据的有效性 什么是IIC协议 I2C&#xff08;Inter-Integrated Circuit&#xff09;通讯协议是由 Phiilps 公司开发的两线式串行总线&#xff0c;用于连接微控制器及其外围设备。是微电子通信控制领域广泛采用的一种总线标准…

详解通信协议之IIC通信协议

详解通信协议之IIC通信协议 本文结合AT24C02对IIC通信协议原理进行了描述。 IIC通信协议(以AT24C02为例) IIC通讯协议(Inter&#xff0d;Integrated Circuit)是由 Philips 公司开发双向同步半双工串行总线&#xff0c;只需要两根线(SDA、SCL)即可在连接于总线上的器件之间传…

IIC(I2C)通信协议详解

简介 I2C 是飞利浦公司设计的&#xff0c;一种很常见的总线协议&#xff0c; I2C 使用两条线在主控制器和从机之间进行数据通信。一条是 SCL(串行时钟线)&#xff0c;另外一条是SDA(串行数据线)&#xff0c;这两条数据线需要接上拉电阻&#xff0c;总线空闲的时候 SCL 和 SDA …

IIC 通信协议

一、IIC 通信协议介绍 IIC(Inter-Integrated Circuit)总线是一种由PHILIPS公司开发的两线式串行总线&#xff0c;用于连接微控制器及其外围设备。 如今主要在服务器管理中使用&#xff0c;其中包括单个组件状态的通信。例如管理员可对各个组件进行查询&#xff0c;以管理系统…

三大通信协议(二):IIC通信协议

目录 1. 概念2. 硬件连接3. 数据传输协议3.1 开始信号3.2 地址位3.3 读写位&#xff08;R/W&#xff09;3.4 应答位&#xff08;ACK / NACK&#xff09;3.5 数据位&#xff08;8Bit&#xff09;3.6 停止信号 4. 软件编写4.1 初始化4.2 开始信号4.3 IIC发送一个字节数据4.4 IIC读…

IIC通信协议总结

&#xff08;1&#xff09;概述 I2C(Inter-Integrated Circuit BUS) 集成电路总线&#xff0c;该总线由NXP&#xff08;原PHILIPS&#xff09;公司设计&#xff0c;多用于主控制器和从器件间的主从通信&#xff0c;在小数据量场合使用&#xff0c;传输距离短&#xff0c;任意时…

IIC通信协议,搞懂这篇就够了

注&#xff1a;公众号后台发送 “IIC” 即可获取基于STM32上实现软件模拟IIC的完整代码。 I2C(IIC)属于两线式串行总线&#xff0c;由飞利浦公司开发用于微控制器(MCU)和外围设备(从设备)进行通信的一种总线&#xff0c;属于一主多从(一个主设备(Master)&#xff0c;多个从设备…

IIC通讯协议

一、简介 IIC&#xff08;Inter-integerted Circuit&#xff09;集成电路总线&#xff0c;该通信协议由NXP&#xff08;原PHILIPS&#xff09;公司设计&#xff0c;多用于主控制器和从器件间的主从通信&#xff0c;在小数据量场景下使用&#xff0c;传输距离短&#xff0c;任意…

搜狗搜索正式接入微信公众号

搜狗搜索正式接入微信公众号 6月9日中午消息&#xff0c;搜狗搜索今日宣布正式接入微信公众号数据。用户将在搜狗搜索页面查询和浏览微信公众号文章。 据悉&#xff0c;在搜狗搜索框中输入微信公众号关键词&#xff0c;便可在搜索结果页中查看相关微信公众号的文章列表&#xf…

Python爬虫 selenium自动化 利用搜狗搜索爬取微信公众号文章信息

少年最好的地方就是:虽然嘴上说要放弃,心底却总会憋着一口气。——刘同 文章目录 一、需求和网页分析二、selenium爬虫一、需求和网页分析 URL:https://weixin.sogou.com/ 你是否有特别喜欢的一些公众号文章,比如说关于网易云热评的。 我那么多遗憾,那么多期盼,你知道…