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)

2.C++中int、string等常见类型转换

02.树的序列化与反序列化(C++)的更多相关文章

  1. DotNet的JSON序列化与反序列化

    JSON(JavaScript Object Notation)JavaScript对象表示法,它是一种基于文本,独立于语言的轻量级数据交换格式.在现在的通信中,较多的采用JSON数据格式,JSON有 ...

  2. Java基础学习总结——Java对象的序列化和反序列化

    一.序列化和反序列化的概念 把对象转换为字节序列的过程称为对象的序列化. 把字节序列恢复为对象的过程称为对象的反序列化. 对象的序列化主要有两种用途: 1) 把对象的字节序列永久地保存到硬盘上,通常存 ...

  3. Java对象表示方式1:序列化、反序列化和transient关键字的作用

    平时我们在Java内存中的对象,是无法进行IO操作或者网络通信的,因为在进行IO操作或者网络通信的时候,人家根本不知道内存中的对象是个什么东西,因此必须将对象以某种方式表示出来,即存储对象中的状态.一 ...

  4. Java基础知识:序列化和反序列化

    一.序列化和反序列化的概念 把对象转换为字节序列的过程称为对象的序列化. 把字节序列恢复为对象的过程称为对象的反序列化. 对象的序列化主要有两种用途: 1) 把对象的字节序列永久地保存到硬盘上,通常存 ...

  5. 序列化、反序列化和transient关键字的作用

    引言 将 Java 对象序列化为二进制文件的 Java 序列化技术是 Java 系列技术中一个较为重要的技术点,在大部分情况下,开发人员只需要了解被序列化的类需要实现 Serializable 接口, ...

  6. lintcode : 二叉树的序列化和反序列化

    题目 二叉树的序列化和反序列化 设计一个算法,并编写代码来序列化和反序列化二叉树.将树写入一个文件被称为“序列化”,读取文件后重建同样的二叉树被称为“反序列化”. 如何反序列化或序列化二叉树是没有限制 ...

  7. Java对象的序列化和反序列化[转]

    Java基础学习总结--Java对象的序列化和反序列化 一.序列化和反序列化的概念 把对象转换为字节序列的过程称为对象的序列化.把字节序列恢复为对象的过程称为对象的反序列化. 对象的序列化主要有两种用 ...

  8. 深入分析Java的序列化与反序列化

    序列化是一种对象持久化的手段.普遍应用在网络传输.RMI等场景中.本文通过分析ArrayList的序列化来介绍Java序列化的相关内容.主要涉及到以下几个问题: 怎么实现Java的序列化 为什么实现了 ...

  9. java 对象的序列化与反序列化

    一.序列化和反序列化的概念 把对象转换为字节序列的过程称为对象的序列化. 把字节序列恢复为对象的过程称为对象的反序列化. 对象的序列化主要有两种用途: 1) 把对象的字节序列永久地保存到硬盘上,通常存 ...

随机推荐

  1. (转) GEM透视阴影贴图

    转载:小道 透视阴影贴图(Perspective Shadow Maps, PSMs)是由Stamminger和Drettakis在 SIGGRAPH 2002上提出的一种阴影贴图(Shadow Ma ...

  2. Java进阶知识点:不要只会写synchronized - JDK十大并发编程组件总结

    一.背景 提到Java中的并发编程,首先想到的便是使用synchronized代码块,保证代码块在并发环境下有序执行,从而避免冲突.如果涉及多线程间通信,可以再在synchronized代码块中使用w ...

  3. NOIP2019普及级别模拟 3.30校模拟

    好吧我还是第一次写这种总结类的玩意… 考场心情…hmm…我没睡醒.是的是这样的,反正题都有两三个看错了或者没看懂… 最关键的是!!我!居!然!把!Freopen!写!在!了!程!序!最!后! 然后就和 ...

  4. vue.js学习之 打包为生产环境后,页面为白色

    vue.js学习之 打包为生产环境后,页面为白色 一:配置问题 当我们将项目打包为生产环境后,在dist文件夹下打开index.html,会发现页面为白色. 1:打开config>index.j ...

  5. Saruman's Army(贪心)

    Saruman the White must lead his army along a straight path from Isengard to Helm’s Deep. To keep tra ...

  6. “hello world!”团队第三次会议

    团队“hello world!”团队召开的第三次会议.博客内容: 一.会议时间 二.会议地点 三.会议成员 四.会议内容 五.todo list 六.会议照片 七.燃尽图 一.会议时间 2017年10 ...

  7. C#通过SC命令和静态公共类来操作Windows服务

    调用的Windows服务应用程序网址:http://www.cnblogs.com/pingming/p/5115304.html 一.引用 二.公共静态类:可以单独放到类库里 using Syste ...

  8. HTML5拖拽表格中单元格间的数据库

    效果图:

  9. 【ASP.NET Core】ASP.NET Core API 版本控制

    几天前,我和我的朋友们使用 ASP.NET Core 开发了一个API ,使用的是GET方式,将一些数据返回到客户端 APP.我们在前端进行了分页,意味着我们将所有数据发送给客户端,然后进行一些dat ...

  10. vs code 自动补全效果不理想的问题

    之前一直用webstorm,最近换换口味,改用了VS Code,发现VS Code 智能提示得到的都不是我想要的 就比如  ! + tab ,HTML结构都出不来.经过一番搜索,发现是 VS Code ...