02.树的序列化与反序列化(C++)
1.二叉树的序列化
输入的一棵树:

//二叉树的先序遍历-序列化 #include <iostream>
#include <string>
#include <sstream> using namespace std; struct TreeNode {
int val;
TreeNode* left;
TreeNode* right;
TreeNode(int x) :val(x), left(NULL), right(NULL) {} //构造函数
}; class Solution {
public:
string treeToStr(TreeNode* head) {
if (head == NULL) {
return "#_";
}
string res = int2str(head->val) + "_";
res += treeToStr(head->left);
res += treeToStr(head->right);
return res;
}
//int to string
string int2str(const int &int_temp)
{
stringstream stream;
stream << int_temp;
string string_temp = stream.str(); //此处也可以用 stream>>string_temp
return string_temp;
}
}; int main() {
//生成一棵二叉树
TreeNode* head = new TreeNode();
head->left = new TreeNode();
head->right = new TreeNode();
head->left->right = new TreeNode();
head->right->left = new TreeNode(); Solution test;
string s = test.treeToStr(head);
for (auto c : s) {
cout << c;
}
cout << endl;
return 0;
2.二叉树的反序列化
2.1 上面采用的先序遍历序列化,方便再反序列化回来:
- 字符串的第一个结点就是根结点;
- 先序遍历的非递归写法,用栈容易实现;
class Solution {
public:
TreeNode* strToTree(string s) {
//判空
int sz = s.size();
if (sz == ) return NULL;
//先序遍历,借助栈
stack<TreeNode*> stack;
int idx = ;
TreeNode* head = new TreeNode((c2i(s[idx])));
idx = idx + ;//跳过‘_’分隔符
TreeNode* cur = head;
while ((cur || !stack.empty() )&& idx<sz) {
//借助栈,先序遍历
if (cur) {
stack.push(cur);
cur->left = gNode(s[idx]);
idx += ;//跳过‘_’分隔符
cur = cur->left;
}
else {
cur = stack.top();
cur->right = gNode(s[idx]);
idx += ;
stack.pop();
cur = cur->right;
}
}
return head;
}
//generate TreeNode
TreeNode* gNode(char a) {
if (a == '#')
return NULL;
else {
return new TreeNode(c2i((a)));
}
}
//char to int
int c2i(const char &char_temp)
{
stringstream stream;
stream << char_temp;
int int_temp;
stream >> int_temp;
return int_temp;
}
};
2.2 测试的完整代码,通过字符串还原成树,再输出为字符串,判断是否正确
//二叉树的反序列化-先序遍历 #include <iostream>
#include <string>
#include <sstream>
#include <stack> using namespace std; struct TreeNode {
int val;
TreeNode* left;
TreeNode* right;
TreeNode(int x) :val(x), left(NULL), right(NULL) {} //构造函数
}; class Solution1{
public:
string serial_Of_Tree(TreeNode* head) {
if (head == NULL) {
return "#_";
}
string res = int2str(head->val) + "_";
res += serial_Of_Tree(head->left);
res += serial_Of_Tree(head->right);
return res;
}
//int to string
string int2str(const int &int_temp)
{
stringstream stream;
stream << int_temp;
string string_temp = stream.str(); //此处也可以用 stream>>string_temp
return string_temp;
}
}; class Solution {
public:
TreeNode* strToTree(string s) {
//判空
int sz = s.size();
if (sz == ) return NULL; //
stack<TreeNode*> stack;
int idx = ;
TreeNode* head = new TreeNode((c2i(s[idx])));
idx = idx + ; TreeNode* cur = head;
while ((cur || !stack.empty() )&& idx<sz) { if (cur) {
stack.push(cur);
cur->left = gNode(s[idx]);
idx += ;
cur = cur->left;
}
else {
cur = stack.top();
cur->right = gNode(s[idx]);
idx += ;
stack.pop();
cur = cur->right;
}
} return head;
} //generate TreeNode
TreeNode* gNode(char a) {
if (a == '#')
return NULL;
else {
return new TreeNode(c2i((a))); }
} //char to int
int c2i(const char &char_temp)
{
stringstream stream;
stream << char_temp;//stream作为中转站,另外使用<<和>>
int int_temp;
stream >> int_temp;
return int_temp;
}
}; int main() {
string s = "3_1_#_2_#_#_5_4_#_#_#_";
Solution test1;
TreeNode* t= test1.strToTree(s);
Solution1 test;
string s2 = test.serial_Of_Tree(test1.strToTree(s)); for (auto a : s2) {
cout << a;
}
cout << endl;
return ;
}

参考资料:
1.二叉树的序列化和反序列化 (层次遍历,用队列实现的反序列化,java)
02.树的序列化与反序列化(C++)的更多相关文章
- DotNet的JSON序列化与反序列化
JSON(JavaScript Object Notation)JavaScript对象表示法,它是一种基于文本,独立于语言的轻量级数据交换格式.在现在的通信中,较多的采用JSON数据格式,JSON有 ...
- Java基础学习总结——Java对象的序列化和反序列化
一.序列化和反序列化的概念 把对象转换为字节序列的过程称为对象的序列化. 把字节序列恢复为对象的过程称为对象的反序列化. 对象的序列化主要有两种用途: 1) 把对象的字节序列永久地保存到硬盘上,通常存 ...
- Java对象表示方式1:序列化、反序列化和transient关键字的作用
平时我们在Java内存中的对象,是无法进行IO操作或者网络通信的,因为在进行IO操作或者网络通信的时候,人家根本不知道内存中的对象是个什么东西,因此必须将对象以某种方式表示出来,即存储对象中的状态.一 ...
- Java基础知识:序列化和反序列化
一.序列化和反序列化的概念 把对象转换为字节序列的过程称为对象的序列化. 把字节序列恢复为对象的过程称为对象的反序列化. 对象的序列化主要有两种用途: 1) 把对象的字节序列永久地保存到硬盘上,通常存 ...
- 序列化、反序列化和transient关键字的作用
引言 将 Java 对象序列化为二进制文件的 Java 序列化技术是 Java 系列技术中一个较为重要的技术点,在大部分情况下,开发人员只需要了解被序列化的类需要实现 Serializable 接口, ...
- lintcode : 二叉树的序列化和反序列化
题目 二叉树的序列化和反序列化 设计一个算法,并编写代码来序列化和反序列化二叉树.将树写入一个文件被称为“序列化”,读取文件后重建同样的二叉树被称为“反序列化”. 如何反序列化或序列化二叉树是没有限制 ...
- Java对象的序列化和反序列化[转]
Java基础学习总结--Java对象的序列化和反序列化 一.序列化和反序列化的概念 把对象转换为字节序列的过程称为对象的序列化.把字节序列恢复为对象的过程称为对象的反序列化. 对象的序列化主要有两种用 ...
- 深入分析Java的序列化与反序列化
序列化是一种对象持久化的手段.普遍应用在网络传输.RMI等场景中.本文通过分析ArrayList的序列化来介绍Java序列化的相关内容.主要涉及到以下几个问题: 怎么实现Java的序列化 为什么实现了 ...
- java 对象的序列化与反序列化
一.序列化和反序列化的概念 把对象转换为字节序列的过程称为对象的序列化. 把字节序列恢复为对象的过程称为对象的反序列化. 对象的序列化主要有两种用途: 1) 把对象的字节序列永久地保存到硬盘上,通常存 ...
随机推荐
- Python入门(4)
一.while循环 有时候,你可能需要计算机来帮重复做一件事,这时就需要循环. while condition: statements (else: statements ) 当condition条件 ...
- 自测之Lesson7:设备文件操作
题目:请编写一个输入密码(不回显)的程序,要求通过设置终端来完成. 完成代码: #include <stdio.h> #include <unistd.h> #include ...
- 团队作业week9 情景测试
一.使用人群:学生.计算机工作者.对计算机感兴趣的人 1.学生:学生是学霸系统的主要用户.学生一般会通过网络寻找与自己的课程,作业有关的信息.首先,可以通过我们的搜索功能在我们的数据库中寻找我们从网络 ...
- 计算器软件实现系列(六)windowform窗体+SQL+策略模式
一 整体概述 这个计算器软件的功能和以前的功能基本上一样,只不过是数据的保存形式发生了变化,,以前用的是txt文件保存,现在更正用SQL数据库,现在更改了以前的文件保存形式,是三层架构中数据层的更换, ...
- Mininet实验 MAC地址学习
实验目的 了解交换机的MAC地址学习过程. 了解交换机对已知单播.未知单播和广播帧的转发方式. 实验原理 MAC(media access control,介质访问控制)地址是识别LAN节点的标识.M ...
- Calculation PartⅡ
GitHub/object-oriented 误删内容--周末修复
- 【week3】词频统计 单元测试
使用Eclipse 集成的Junit进行单元测试.单元测试的核心包括断言.注解. 测试代码如下: @BeforeClass // 针对所有测试,只执行一次,且必须为static void public ...
- new关键字 、this关键字、base关键字
使用new,所做的三件事: 1. (类是引用对象,引用对象是在堆中开辟空间)在堆中开辟空间 2. 在开辟的堆空间中创建对象 3. 调用对象的构建函数 4. 隐藏父类成员:子类的成员可以与隐藏从父类继承 ...
- 文件“bin\Debug\WindowsFormsApplication2.exe”正由另一进程使用,因此该进程无法访问该文件。
http://zhidao.baidu.com/question/221394579.html?qbl=relate_question_2&word=%BE%AF%B8%E6%094%09%C ...
- java-实用的sql语句
一.在数据库创建表格的SQL语句 1,创建一个link表格,包含属性:lid 主键,title 标题, imgpath 图片地址 , url 网址 , info 说明, isshow 显示1 ...