【深度优先搜索 广度优先搜索】297. 二叉树的序列化与反序列化

本文涉及知识点

深度优先搜索 广度优先搜索
深度优先搜索汇总
图论知识汇总

LeetCode297. 二叉树的序列化与反序列化

序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据。
请设计一个算法来实现二叉树的序列化与反序列化。这里不限定你的序列 / 反序列化算法执行逻辑,你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构。
提示: 输入输出格式与 LeetCode 目前使用的方式一致,详情请参阅 LeetCode 序列化二叉树的格式。你并非必须采取这种方式,你也可以采用其他的方法解决这个问题。
示例 1:
输入:root = [1,2,3,null,null,4,5]
在这里插入图片描述

输出:[1,2,3,null,null,4,5]
示例 2:
输入:root = []
输出:[]
示例 3:
输入:root = [1]
输出:[1]
示例 4:
输入:root = [1,2]
输出:[1,2]

提示:
树中结点数在范围 [0, 104] 内
-1000 <= Node.val <= 1000

广度优先搜索

用深度优先搜索也可以,只是麻烦得多。
按树的层次存取,同层次年长的在前。为了不处理负数,保存时将数据加上1000。读取后,减去1000。

保存(序列化)

que记录待处理的节点。vector v记录各节点值对应的字符串,空节点对应空字符串。任意节点只有0个或1个父节点,所以无需visit数组,避免重复处理。
初始根节点入队,按顺序从que取节点,如果为空,则v追加空串。
否则:root的值转成字符串追加到v中。左右子节点入队。
v转成成字符串,中间用逗号隔开。

读取(反序列化)

如果字符串为空,返回null。
建立根节点,入队。
依次出队,读取数据。如果数据为空。忽略。
数据不为空,读取数据到节点,并为当前节点建立左右子节点,左右子节点入队。

代码

class Codec {
public:string serialize(TreeNode* root) {vector<string> v;queue<TreeNode*> que;que.emplace(root);while (que.size()) {auto cur = que.front();que.pop();if (nullptr == cur) { v.emplace_back(""); continue; }v.emplace_back(std::to_string(cur->val+1000));que.emplace(cur->left);que.emplace(cur->right);}string str;for (const auto& s : v) {str += s;str += ',';}str.pop_back();return str;}TreeNode* deserialize(string data) {if ("" == data) { return nullptr; }vector<int> nums;for (int left = 0, r = 0; left < data.length(); left = r) {int num = 0;while ((r < data.length()) && (',' != data[r])) {num = num * 10 + data[r] - '0';r++;}if (left == r) {nums.emplace_back(INT_MIN);}else {nums.emplace_back(num-1000);}r++;}if (',' == data.back()) {nums.emplace_back(INT_MIN);}TreeNode* root = new TreeNode(nums[0]);vector< TreeNode*> nodes;nodes.emplace_back(root);for (int i = 1; i < nums.size(); i++) {if (INT_MIN == nums[i]) {continue;}TreeNode* cur = new TreeNode(nums[i]);nodes.emplace_back(cur);const int inx = (i - 1) / 2;if (1 & i) {nodes[inx]->left = cur;}else {nodes[inx]->right = cur;}}return root;}
};

2023年6月版,就是用的深度优先

也不是很麻烦。前序遍历,用括号括起来一个子树,可读性似乎好些。

class Codec {
public:// Encodes a tree to a single string.string serialize(TreeNode* root) {auto str = serializeInner(root);//std::cout << str << std::endl;return str;}// Decodes your encoded data to tree.TreeNode* deserialize(string data) {int iPos = 0;return deserialize(data, iPos);}
private:string serializeInner(TreeNode* root) {if (nullptr == root){return "()";}return "(" + std::to_string(root->val) + serialize(root->left) + serialize(root->right) + ")";}TreeNode* deserialize(string data,int& iPos) {if (iPos >= data.length()){return nullptr;}iPos++;if ( ')' == data[iPos]){iPos ++;return nullptr;}int iValue = 0;int iSign = 1;if ('-' == data[iPos]){iSign = -1;iPos++;}while (::isdigit(data[iPos])){iValue = iValue * 10 + data[iPos] - '0';iPos++;}iValue *= iSign;TreeNode* p = new TreeNode(iValue);p->left = deserialize(data, iPos);p->right = deserialize(data, iPos);iPos++;return p;}
};

扩展阅读

视频课程

先学简单的课程,请移步CSDN学院,听白银讲师(也就是鄙人)的讲解。
https://edu.csdn.net/course/detail/38771

如何你想快速形成战斗了,为老板分忧,请学习C#入职培训、C++入职培训等课程
https://edu.csdn.net/lecturer/6176

相关推荐

我想对大家说的话
《喜缺全书算法册》以原理、正确性证明、总结为主。
按类别查阅鄙人的算法文章,请点击《算法与数据汇总》。
有效学习:明确的目标 及时的反馈 拉伸区(难度合适) 专注
闻缺陷则喜(喜缺)是一个美好的愿望,早发现问题,早修改问题,给老板节约钱。
子墨子言之:事无终始,无务多业。也就是我们常说的专业的人做专业的事。
如果程序是一条龙,那算法就是他的是睛

测试环境

操作系统:win7 开发环境: VS2019 C++17
或者 操作系统:win10 开发环境: VS2022 C++17
如无特殊说明,本算法用**C++**实现。

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

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

相关文章

App UI 风格,引领设计风向

App UI 风格&#xff0c;引领设计风向

vue3 proxy对象转为原始对象

https://cn.vuejs.org/api/reactivity-advanced.html#toraw import { toRaw } from "vue";const foo {} const reactiveFoo reactive(foo)console.log(toRaw(reactiveFoo) foo) // true 人工智能学习网站 https://chat.xutongbao.top

三人拼团模式的核心:二二公排

在电商市场中&#xff0c;拼团模型的玩法是层出不穷&#xff0c;不断有各种新的拼团模式出现&#xff0c;如&#xff1a;七人拼团、全民拼购、预售拼购等等&#xff0c;还有各大电商平台的拼购&#xff0c;如&#xff1a;拼夕夕的拼单购物、镁团的拼好饭等等。下面分享一个全新…

柏曼的台灯值得入手吗?书客、明基横向测评对比

据相关研究显示&#xff0c;我国青少年的近视问题尤为严峻&#xff0c;总体近视率已逼近53%&#xff0c;这一超过半数的数据令人触目惊心。随着孩子学龄的增长&#xff0c;学习负担不断加重&#xff0c;眼部的压力也随之剧增&#xff0c;从而导致近视率持续攀升。普通台灯可能发…

Chromium源码阅读:深入理解Mojo框架的设计思想,并掌握其基本用法(1)

Mojo简介 Mojo 是一个运行时库的集合&#xff0c;提供与平台无关的通用 IPC 原语抽象、消息 IDL 格式以及具有针对多种目标语言的代码生成的绑定库&#xff0c;以便于跨任意进程间和进程内边界传递消息。 Mojo 分为清晰分离的层&#xff0c;子组件的基本层次结构如下&#xff…

KVM+GFS高可用

资源列表 操作系统 IP 主机名 Centos7 192.168.10.51 gfs1 Centos7 192.168.10.52 gfs2 Centos7 192.168.10.53 kvm 在gfs节点部署GlusterFS #添加hosts解析 cat >> /etc/hosts << EOF 192.168.10.51 gfs1 192.168.10.52 gfs2 192.168.10.53 kvm EOF …

Chrome DevTools开发者调试工具

Chrome DevTools 是一个功能强大的网页开发工具&#xff0c;集成在谷歌浏览器中&#xff0c;帮助开发者调试和优化网页应用。以下是详细的功能说明和使用技巧&#xff1a; 1. 打开 DevTools 快捷键&#xff1a;按下 F12 或 CtrlShiftI&#xff08;Windows/Linux&#xff09;或…

jquery.PrintArea.js 设置不打印

jquery.PrintArea.js 是一个用于打印网页特定区域内容的 jQuery 插件。如果你想设置某些内容不被打印&#xff0c;可以使用 CSS 的 media print 媒体查询来控制。 例如&#xff0c;你可以给不想打印的内容添加一个类名&#xff0c;比如 no-print&#xff0c;然后在 CSS 中指定…

2024下《系统分析师》50个高频考点汇总!背就有效

宝子们&#xff01;上半年软考已经结束一段时间了&#xff0c;准备备考下半年软考高级-系统分析师的小伙伴可以开始准备了&#xff0c;毕竟高级科目的难度可是不低的&#xff0c;相信参加过上半年系分的小伙伴深有体会。 这里给大家整理了50个高频考点&#xff0c;涵盖全书90%…

透视环世物流:一个AI降本的产业典型样本

在过去的多年时间里&#xff0c;与其说低代码完成的数字原生的普惠&#xff0c;不如说其最强的能力恰是能帮助企业用最低的门槛、最高的效率构建出与自身适配的流程和业务应用&#xff0c;在底层帮助企业构建出一个被极致拆分和分子化的软件开发中台。 而透过环世物流&#x…

数据结构笔记-2、线性表

2.1、线性表的定义和基本操作 如有侵权请联系删除。 2.1.1、线性表的定义&#xff1a; ​ 线性表是具有相同数据类型的 n (n>0) 个数据元素的有限序列&#xff0c;其中 n 为表长&#xff0c;当 n 0 时线性表是一个空表。若用 L 命名线性表&#xff0c;则其一般表示为&am…

云主机主频不够导致业务卡顿的解决攻略

当云主机的主频不足以满足业务需求时&#xff0c;就可能出现业务卡顿的现象&#xff0c;影响用户体验和企业的运营效率。本文将针对这一问题&#xff0c;提供一套解决攻略&#xff0c;并在结尾处归纳使用弹性云服务器的好处。 一、解决云主机主频不够导致业务卡顿的攻略 ①检…

从报名到领证:软考初级【信息系统运行管理员】报名考试全攻略

本文共计9991字&#xff0c;预计阅读33分钟。包括七个篇章&#xff1a;报名、准考证打印、备考、考试、成绩查询、证书领取及常见问题。 一、报名篇 报名条件要求&#xff1a; 1.凡遵守中华人民共和国宪法和各项法律&#xff0c;恪守职业道德&#xff0c;具有一定计算机技术…

利用AI大模型,将任何文本语料转化为知识图谱,可本地运行!

几个月前&#xff0c;基于知识的问答&#xff08;KBQA&#xff09;还是一个新奇事物。 现在&#xff0c;对于任何 AI 爱好者来说&#xff0c;带检索增强生成&#xff08;RAG&#xff09;的 KBQA 就像小菜一碟。看到自然语言处理&#xff08;NLP&#xff09;的可能性领域由于大…

缓存与数据一致性问题

1、更新了数据库&#xff0c;再更新缓存 假设数据库更新成功&#xff0c;缓存更新失败&#xff0c;在缓存失效和过期的时候&#xff0c;读取到的都是老数据缓存。 2、更新缓存&#xff0c;更新数据库 缓存更新成功了&#xff0c;数据库更新失败&#xff0c;是不是读取的缓存的都…

payable介绍, 编写一个转账的测试合约

目录 1. payable介绍 2. 编写一个转账的测试合约 3. 详解如何使用该合约 3.1. 转账前: 3.2. 点击deposit1转账: 3.3. 点击getBalance查看当前合约的额度: 3.4. 点击withdraw把当前合约的所有余额全部转到调用者: 3.5. 再次查看合约拥有的以太币: 1. payable介绍 在…

CP AUTOSAR标准中文文档链接索引(更新中)

AUTOSAR标准的核心组件包括通信、诊断、安全等&#xff0c;这些组件通过模块化结构进行组织。系统被划分为多个模块&#xff0c;每个模块负责特定的功能。模块之间通过接口进行通信&#xff0c;接口定义了模块之间的交互规则。AUTOSAR标准支持模块的配置&#xff0c;可以根据不…

基于BP神经网络对鸢尾花数据集分类

目录 1. 作者介绍2. 关于理论方面的知识介绍2.1 BP神经网络原理2.2 BP神经网络结构 3. 关于实验过程的介绍&#xff0c;完整实验代码&#xff0c;测试结果3.1 鸢尾花数据集介绍3.2 代码演示3.3 结果演示 4. 问题与分析 1. 作者介绍 侯硕&#xff0c;男&#xff0c;西安工程大学…

【动态规划算法题记录】70. 爬楼梯——递归/动态规划

题目描述 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; 题目分析 递归法&#xff08;超出时间限制&#xff09; 递归参数与返回值 void reversal(int i, int k) 每次我们处理第i个台阶到第k个…

白酒:茅台镇白酒的品牌故事与传奇色彩

茅台镇&#xff0c;这个位于中国贵州省遵义市仁怀市的小镇&#xff0c;因为出产的白酒品质卓着&#xff0c;被誉为“世界名酒之乡”。在这片神奇的土地上&#xff0c;云仓酒庄以其豪迈白酒&#xff0c;书写了一段段品牌故事与传奇色彩。 云仓酒庄豪迈&#xff0c;酿造于茅台镇的…