C++ 二叉树序列化与反序列化

2023-10-31

本人微信公众号:CPP进阶之旅
如果觉得这篇文章对您有帮助,欢迎关注 “CPP进阶之旅” 学习更多技术干货

1、题目要求

  请实现两个函数,分别用来序列化和反序列化二叉树?

2、题目说明

  序列化的意思是指将一些特定的数据结构,变成有格式信息的字符串。例如对一个链表,可以将1->2->3->4->NULL序列化为"1,2,3,4"。对于序列化算法,必须支持反序列化,即在约定的格式下,可以将满足格式要求的字符串重新构造为原始的结构形式。
  二叉树的序列化是指:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字符串,从而使得内存中建立起来的二叉树可以持久保存。序列化可以基于先序、中序、后序、层序的二叉树遍历方式来进行修改,序列化的结果是一个字符串。
  二叉树的反序列化是指:根据某种遍历顺序得到的序列化字符串结果string,重构出原始的二叉树结构。

3、核心问题

  拿到这个题目,我们面临着两个至关重要的问题:
  1、题目是要求序列化二叉树,对于二叉树这种数据结构,很可能存在着空节点,那么,对于空节点,该怎么表示呢?
  2、题目要求实现二叉树的反序列化,我们按照将二叉树序列化为一个字符串的前提,对于一个字符串,我们怎么区分出每个独立的二叉树的节点呢?
以上两个问题,在很多刷题网站会直接给出结论或者结果,这样降低了题目的难度,但作为面试者需要清楚,即使没有提示我们也要注意到这两点问题。即空节点用特殊字符"#"表示,每个节点用逗号“,”分割。也就是反序列化的时候遇到#那么就表示该节点为空节点,可以结束该字符的遍历了。而拆分节点的时候我们只需要取出两个逗号之间的数据即是该节点的值。

4、解题思路

  1.序列化二叉树,借助string类型来拼接序列化的字符串。只需要前序遍历二叉树,当遇到根节点为空时,追加"#",并退出递归,否则追加二叉树的根节点值,接着追加逗号。接下来只需递归实现左子树和右子树的序列化。那么,序列化之后就得到了string类型的字符串。
  2.反序列化二叉树,如果string为空,则直接返回退出。如果遇到"#",则为空节点,退出递归。否则,找到字符数组中的一个二叉树节点值,然后构造根节点,如果此时到达字符末尾,直接返回根节点,否则继续遍历。接下来根结点的左右指针分别连接左子树的递归实现结果和右子树的递归实现结果。

5、代码实现

//二叉树结构
struct TreeNode {
    int val;
    struct TreeNode* left;
    struct TreeNode* right;
    TreeNode(int x) :val(x), left(nullptr), right(nullptr) {}
};
//序列化二叉树
//to_string将每个结点的val值转化为string类型存储在str上。
void Serialize(TreeNode* node, string& s)
{
    if (node == nullptr)
    {
        s.push_back('#');
        s.push_back(',');
        return;
    }
    s += to_string(node->val);
    s.push_back(',');
    Serialize(node->left, s);
    Serialize(node->right, s);
}

//反序列化二叉树
TreeNode* Deserialize(string& s)
{
    if (s.empty())
        return nullptr;
    if (s[0] == '#')
    {
        s = s.substr(2);
        return nullptr;
    }
    TreeNode* node = new TreeNode(stoi(s));
    s = s.substr(s.find_first_of(',') + 1);
    node->left = Deserialize(s);
    node->right = Deserialize(s);
    return node;
}

6、问题扩展

  问题1. 将题目中的节点值类型由int换为string,我们还能用"#“来表示空节点吗?还能用”,“来分割节点吗?
  问题2. Serialize里使用了”+=",他的复杂度是怎样的,请分析一下?
  提示一下,问题1,解决的思路类似于网络请求中请求参数的处理。问题2,主要是考察了string的操作符重载的过程。

7、重要说明

欢迎关注我的个人微信公众号,查看专业的客户端/服务端开发知识、笔试面试题目、程序员职场经验与心得分享。
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ 二叉树序列化与反序列化 的相关文章

随机推荐

  • Python3 IDLE打不开,点击之后没反应

    python 2 IDLE打不开见python2 IDLE启动失败 电脑同时装了python2和python3 python2IDLE能打开 python3打不开 出现这种情况多半是环境变量配置有问题 直接打开IDLE看不到报错 可在命令行
  • 我的Github开源项目,从0到20000 Star!

    最近 我在Github上面开源的项目mall已经突破了20000 Star 这个项目是2018年3月份开始开发的 耗时9个月 发布了第一个版本 一直维护至今 回想起来 还是有诸多感慨的 下面我就谈谈我的项目发展的整个历程 项目发展历程 为什
  • jpg图片转pdf都有哪些工具?分享最简单的方法

    在互联网时代 JPG图片在我们的日常生活中变得越来越普遍 虽然在网上传输图片非常方便 但有时候我们需要将图片打印出来 这时候直接打印图片可能会导致失真 而且图片的大小和样式也不容易确定 将JPG图片转换成PDF格式 然后再打印 可以方便地解
  • Qt打包生成可执行程序

    一 为什么QT要打包和部署 因为我们要把写好的程序发给用户来用 我们写好的源码也不是随便给别人的 二 QT如何打包和部署 1 我们把工厂切换到release模式 然后编译 release模式 基本没有调试信息 debug模式 有很多调试信息
  • STM32学习:通过DMA读取ADC规则通道多通道转换数据

    1 STM32的DMA简介 直接存储器存取 DMA 用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输 无须CPU干预 数据可以通过DMA快速地移动 这就节省了CPU的资源来做其他操作 两个DMA控制器有12个通道 DMA1有7
  • MATLAB基本运算

    算术运算 1 基本运算符 加 减 乘 右除 左除 乘方 MATLAB的算术运算是在矩阵意义下进行的 单个数据的算术运算只是矩阵运算的一种特例 加减运算 若两矩阵同型 则运算时两矩阵的相应元素相加减 若两矩阵不同型 则MATLAB将给出错误信
  • 《科研伦理与学术规范》期末考试答案2023

    1 单选 2 分 关于科研伦理描述不正确的说法是 A 规范则未必均是在道德层面上具有调整性 B 伦理学已经从传统的以人为中心走向现代的以行为为中心 C 现代伦理学主要关注以行为 准则 规范 义务 D 所有的规范的评判都涉及到 善恶正邪 的价
  • C#实现QQ窗体功能

    C 实现QQ窗体功能 案例简述 预备知识导图 功能结构 知识点分析 C 基础知识 Windows系统知识 控件和组件 案例简述 通过C 使用类似QQ窗体的功能 当窗体放置到屏幕的边缘 可以将窗体隐藏 当鼠标再次放置到屏幕边缘时 窗体可再次显
  • centos安装docker详细步骤

    目录 一 前言 1 环境要求 2 官网中文安装参考手册 二 安装步骤 1 卸载旧版本 2 安装需要的软件包 3 设置docker镜像源 1 配置docker镜像源 方式1 官网地址 外国 方式2 阿里云源 2 查看配置是否成功 4 更新yu
  • 使用sklearn完成4种基本的分类算法:朴素贝叶斯算法、决策树算法、人工神经网络、支持向量机算法

    文章目录 实验目的 实验内容及步骤 实验数据说明 实验过程 朴素贝叶斯分类 决策树 决策树概念简介 神经网络 SVM 实验目的 巩固4种基本的分类算法的算法思想 朴素贝叶斯算法 决策树算法 人工神经网络 支持向量机算法 能够使用现有的分类器
  • iOS编程基础-Swift(四)-对象类型(续)

    Swift iOS9 Programming Fundamentals With swift 第四章 对象类型 第三章介绍了一些内建对象类型 不过还没有谈及对象类型本身 即 枚举 结构体 和 类 本章结构 1 介绍一下对象类型 2 详细介绍
  • 时空RBF-NN预测混沌时间序列

    时空RBF NN预测混沌时间序列 混沌理论是现代非线性动力学研究的重要分支之一 混沌现象不仅存在于物理系统中 还出现在金融 生物等领域中 混沌时间序列的预测一直是研究者关注的焦点 本文提出了一种基于时空RBF NN的混沌时间序列预测方法 并
  • OMA DM终端管理

    居然还有这个东西 今天才知道 好强大 OMA全称是Open Mobile Alliance 即开放移动联盟 成立于2002年7月 由近200家公司组成 它的目的是搜集市场需求 规范业务应用层和网络功能层之间的接口 定义一个公开的标准框架 从
  • web项目时Spring监听器配置

    问题 每次使用ClassPathXmlApplicationContext 和getBean 方法时 都会加载spring配置文件 影响性能 解决方案 1 在服务器启动的时候 创建对象加载配置文件 2 底层使用监听器 listener 和S
  • ISE中FIFO IP核的Standard FIFO和First-word-Fall-Through模式的仿真比较

    ISE下的FIFO IP核有Standard FIFO和First word Fall Through两种模式 相对于标准模式FWFT First word Fall Through 可以不需要读命令 自动的将最新数据放在dout上 接下来
  • Qt中的串口编程之一

    QtSerialPort 简介 QtSerialPort模块是Qt5库的附加部分 为硬件和虚拟的串口提供了统一的接口 注意 该模块也增加了对Qt4的支持 串口由于其简单和可靠 目前在像嵌入式系统 机器人等工业中依旧用得很多 使用QtSeri
  • QFrame类使用总结

    QFrame与QWidget的区别 QFrame是基本控件的基类 QWidget是QFrame基类 关系如下 QPushButton QLabel gt QFrame gt QWidget 我们经常会从QFrame或者QWidget继承然后
  • 手机把网页保存为html,怎么保存整个网页

    手机评站网今天精心准备的是 怎么保存整个网页 下面是详解 如何另存整个网页 如何另存整个网页 如何另存整个网页 1 在手机桌面中找到手机百度 点击打开手机百度 如下图所示 2 在手机百度中找到自己想要另存为的网页 点击进入该网页如下图所示
  • Visual Studio运行程序执行太快,看不到运行屏幕的结果,设置项目属性解决。

    一 右击项目 找到属性 二 找到链接器 三 链接器中找到子系统 子系统 选择控制台 SUBSYSTEM CONSOLE 应用 确定即可 四 也可以补充getchar 可以利用从键盘获取一个字符 来显示调试窗口
  • C++ 二叉树序列化与反序列化

    本人微信公众号 CPP进阶之旅 如果觉得这篇文章对您有帮助 欢迎关注 CPP进阶之旅 学习更多技术干货 C 二叉树序列化与反序列化 1 题目要求 2 题目说明 3 核心问题 4 解题思路 5 代码实现 6 问题扩展 7 重要说明 1 题目要