力扣刷题TOP101: 32.BM39 序列化二叉树

目录:

目的

思路

复杂度

记忆秘诀

python代码

目的:

请实现两个函数,分别用来序列化和反序列化二叉树,不对序列化之后的字符串进行约束,但要求能够根据序列化之后的字符串重新构造出一棵与原二叉树相同的树。


思路

什么是序列化(Serialize)?

将一棵二叉树转换为字符串,序列化是将树转换成线性结构的过程。

  •  使用前序遍历,递归地访问每个节点。
  •  用 # 表示空节点,节点值使用逗号连接成字符串。

补充:

  • 前序遍历:最常见的选择,适用于二叉树的序列化和反序列化,因为它能够非常直观地描述树的结构,且容易递归实现。
  • 中序遍历:通常不用于树的序列化,因为它不能唯一标识二叉树(除非是二叉搜索树)。
  • 后序遍历:也能序列化树,但相较于前序遍历,应用场景不那么广泛。
  • 层次遍历:适用于特定场景(如完全二叉树),但是实现较为复杂。

因此,尽管可以使用不同的遍历方法来实现序列化和反序列化,但前序遍历通常是最简单、最常用的方法。

什么是反序列化(Deserialize)

将序列化后的字符串恢复成原始的二叉树

  • 根据序列化的字符串,分割成节点值列表。
  • 使用递归方法,通过索引位置逐步重建树结构。

代码逻辑:

1. 序列化:Serialize 方法:

  • 初始化一个空列表 result:这个列表用于存储树的遍历结果。
  • 定义一个递归函数 pre_order:该函数接收一个节点作为参数,采用前序遍历的方法遍历树:
    • 如果节点为空 (None),则将 # 作为标记添加到 result 中,表示该位置是空节点。
    • 如果节点不为空,首先把节点的值转化为字符串并添加到 result 中,然后递归地调用 pre_order 对左右子树进行遍历。
  • 调用 pre_order(root):从根节点开始遍历整个树。
  • 返回结果:用逗号 ,result 中的元素连接成一个字符串返回。

2. 反序列化:Deserialize 方法:

  • 分割字符串:首先用逗号 , 将序列化字符串分割成一个列表 values,该列表包含了节点值和空节点标记(#)。
  • 初始化一个索引 self.index:用于跟踪当前处理到的字符串中的位置。
  • 定义一个递归函数 build_tree:该函数根据当前 self.index 索引的值构建二叉树:
    • 如果当前值是 #,表示当前节点为空,跳过该位置并返回 None
    • 否则,创建一个新的节点,并递归地构建该节点的左子树和右子树。
  • 递归地构建树:调用 build_tree() 来构建整棵树。

复杂度

  • 时间复杂度:O(n)

    • 序列化和反序列化的时间复杂度均为 O(n),其中 n 是节点的数量。每个节点被访问一次。
  • 空间复杂度:O(h)

    • 其中 h 是树的高度。递归时需要用到递归栈,最坏情况下(完全不平衡的树),空间复杂度为 O(n),在平衡树的情况下为 O(log n)。

记忆秘诀

  • 序列化,遍历树:使用前序遍历(根 -> 左 -> 右)来遍历整棵树。
  • 空节点用井号标:空节点用 # 来表示。
  • 节点值,先存储:先把节点的值保存到结果列表。
  • 递归左、右子树好:递归处理左子树和右子树。
  • 结果串,逗号连:最后用逗号 , 将所有节点值(包括空节点 #)连接成字符串。

  • 反序列化,拆字符串:将序列化字符串用逗号分割成列表。
  • 遇井号,空节点:遇到 #,表示空节点,跳过并返回 None
  • 值存储,建节点:节点值不为 # 时,创建节点。
  • 左右子树递归连:递归构建左子树和右子树。

python代码

# -*- coding:utf-8 -*-
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
class Solution:def Serialize(self, root):"""序列化二叉树"""# 使用列表来存储序列化结果result = []def pre_order(node):if node is None:result.append('#')  # 使用 # 表示空节点else:result.append(str(node.val))  # 存储节点值pre_order(node.left)  # 递归左子树pre_order(node.right)  # 递归右子树pre_order(root)return ','.join(result)  # 以逗号连接成字符串def Deserialize(self, s):"""反序列化二叉树"""values = s.split(',')  # 将字符串分割成节点值列表self.index = 0  # 使用索引来跟踪当前值def build_tree():if self.index >= len(values) or values[self.index] == '#':self.index += 1  # 跳过 # 或者越界return None# 创建节点并递归构建左子树和右子树node = TreeNode(int(values[self.index]))self.index += 1node.left = build_tree()  # 递归构建左子树node.right = build_tree()  # 递归构建右子树return nodereturn build_tree()  # 开始构建树

* 欢迎大家探讨新思路,能够更好的理解和记忆

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/889471.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL有哪些高可用方案?

大家好,我是锋哥。今天分享关于【MySQL有哪些高可用方案?】面试题。希望对大家有帮助; MySQL有哪些高可用方案? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 MySQL 高可用方案旨在确保数据库系统的高可靠性、低宕机时间、以及在硬件故障…

An error happened while trying to locate the file on the Hub and we cannot f

An error happened while trying to locate the file on the Hub and we cannot find the requested files in the local cache. Please check your connection and try again or make sure your Internet connection is on. 关于上述comfy ui使用control net预处理器的报错问…

Nginx之配置防盗链(Configuring Anti-hotlinking in Nginx)

运维小白入门——Nginx配置防盗 什么是防盗链: 防盗链技术主要用于防止未经授权的第三方或域名访问网站的静态资源。例如,一个网站可能拥有独特的图片素材,为了防止其他网站通过直接链接图片URL的方式访问这些图片,网站管理员会采…

深度学习:CPU和GPU算力

一、算力 “算力”(Computing Power)通常是指计算机或计算系统执行计算任务的能力。它是衡量系统处理数据、运行算法以及执行计算任务效率的重要指标。根据上下文,算力可以在以下几种场景中具体化: 1. 单机算力 CPU算力&#x…

【AI日记】24.12.13 kaggle 比赛 2-3 大扫除、断舍离、自己做饭

【AI论文解读】【AI知识点】【AI小项目】【AI战略思考】【AI日记】 工作 参加:kaggle 比赛 Regression with an Insurance Dataset参考:kaggle 回归类入门比赛 House Prices - Advanced Regression Techniques内容:构建自己的EDA&#xff08…

【echarts】数据过多时可以左右滑动查看(可鼠标可滚动条)

1. 鼠标左右拖动 在和 series 同级的地方配置 dataZoom: dataZoom: [{type: inside, // inside 鼠标左右拖图表,滚轮缩放; slider 使用滑动条start: 0, // 左边的滑块位置,表示从 0 开始显示end: 60, // 右边的滑块位置&#xf…

pytest -s执行的路径

pytest -s执行的路径: 直接写pytest -s,表示从当前路径下开始执行全部.py的文件。 执行具体指定文件:pytest -s .\testXdist\test_dandu.py 下面这样执行pytest -s 会报找不到文件或没权限访问, 必须要加上具体文件路径pytest -s…

AP AUTOSAR网络管理——Network Management R24-11

AP AUTOSAR——Network Management 1.网络管理 网络管理(Network Management,NM)的定义: NM是自适应平台服务中的一个功能集群,主要管理每个网络节点(包括物理网络和部分网络)在正常运行模式和总线关闭睡眠模式之间的转换。NM的操作独立于所使用的通信网络绑定。直接网…

预处理器Stylus的介绍及使用,并同Less、Sass进行对比(简单介绍)

目录 一、安装与配置 安装Node.js: 安装Stylus: 配置Webpack: 二、编写Stylus代码 定义变量: 使用变量: 嵌套语法: 混合(Mixins): 函数: 6.关键字参…

内网跨“边界”

背景 “边界”通常是指内网与外网之间的那条边界,在内网中,边界也包括各个区域之间的边界。本篇文章主要介绍在内网各种环境中的shell反弹、内网穿透及文件传输方面常用的一些方法和工具,利用这些方法来跨越内网中的层层边界。 当我们获取到…

Docker的镜像

目录 1. 镜像是什么??2. 镜像命令详解2.1 镜像命令清单2.2 docker rmi命令2.3 docker save命令2.4 docker load命令2.5 docker history命令2.6 docker import命令2.7 docker image prune命令2.8 docker build命令 3. 镜像的操作4. 离线迁移镜像5. 镜像存…

Vue Web开发(五)

1. axios axios官方文档 异步库axios和mockjs模拟后端数据,axios是一个基于promise的HTTP库,使用npm i axios。在main.js中引入,需要绑定在Vue的prototype属性上,并重命名。   (1)main.js文件引用 imp…

【合作原创】使用Termux搭建可以使用的生产力环境(六)

前言 在上一篇【合作原创】使用Termux搭建可以使用的生产力环境(五)-CSDN博客我们讲到了如何美化xfce4桌面,达到类似于Windows的效果,这一篇将继续在上一篇桌面的基础上给我们的系统装上必要的软件,让它做到真正可以使…

Java学习教程,从入门到精通,Java Stack(堆栈)语法知识点及语法知识点(58)

Java Stack(堆栈)语法知识点详解 一、概述 栈(Stack)是一种后进先出(Last In First Out, LIFO)或先进后出(First In Last Out, FILO)的数据结构,它只允许在一端&#x…

stm32 hal使用sysTick定时器非阻塞延时方法

简介 一种在stm32 hal库中实现非阻塞任务处理扫描的方式。 stm32f1xx_it.c /* USER CODE BEGIN 0 */ uint8_t Time_1ms 0; uint8_t Time_10ms 0;/* USER CODE END 0 *//*** brief This function handles System tick timer.*/ void SysTick_Handler(void) {/* USER CODE B…

docker简单私有仓库的创建

1:下载Registry镜像 导入镜像到本地中 [rootlocalhost ~]# docker load -i registry.tag.gz 进行检查 2:开启Registry registry开启的端口号为5000 [rootlocalhost ~]# docker run -d -p 5000:5000 --restartalways registry [rootlocalhost ~]# dock…

AI技术架构:从基础设施到应用

人工智能(AI)的发展,正以前所未有的速度重塑我们的世界。了解AI技术架构,不仅能帮助我们看懂 AI 的底层逻辑,还能掌握其对各行业变革的潜力与方向。 一、基础设施层:AI 技术的坚实地基 基础设施层是 AI 技…

Python Turtle 实现动态时钟:十二时辰与星空流星效果

在这篇文章中,我将带你通过 Python 的 turtle 模块构建一个动态可视化时钟程序。这个时钟不仅具备传统的时间显示功能,还融合了中国古代的十二时辰与八卦符号,并通过动态星空、流星效果与昼夜背景切换,为程序增添了观赏性和文化内…

将PDF流使用 canvas 绘制然后转为图片展示在页面上(二)

将PDF流转为图片展示在页面上 使用 pdfjs-dist 库来渲染 PDF 页面到 canvas 上,然后将 canvas 转为图片 安装 pdfjs-dist 依赖 npm install pdfjs-dist 或者 yarn add pdfjs-dist创建一个组件来处理 PDF 流的加载和渲染 该组件中是一个包含 PDF 文件的 ArrayBuffer…

UOS AI 2.0 发布,开启原生 AIOS 时代!

PC 终端作为最主流最高频的生产力工具,其操作系统承载着用户的大量场景、数据以及技能。随着生成式人工智能浪潮的来临,新的技术架构、交互模式和新的生态,都需要操作系统承担起更多责任,即需要新一代的操作系统产品 ——AIOS&…