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. JAVA基础学习之路(五)数组的定义及使用

    什么是数组:就是一堆相同类型的数据放一堆(一组相关变量的集合) 定义语法: 1.声明并开辟数组 数据类型 数组名[] = new 数据类型[长度]: 2.分布完成 声明数组:数据类型 数组名 [] = ...

  2. day-17 L1和L2正则化的tensorflow示例

    机器学习中几乎都可以看到损失函数后面会添加一个额外项,常用的额外项一般有两种,一般英文称作ℓ1-norm和ℓ2-norm,中文称作L1正则化和L2正则化,或者L1范数和L2范数.L2范数也被称为权重衰 ...

  3. 使用cout进行格式化

    以下内容摘自木缥缈的博客 使用cout进行格式化 ostream插入运算符将值转换为文本格式.在默认情况下,格式化值的方式如下. * 对于char值,如果它代表的是可打印字符,则将被作为一个字符显示在 ...

  4. c#笔记整理 关于继承与多态等

    [ 塔 · 第 二 条 约 定 ] c#面向对象基础 整理private.protected.public.abstract等的异同 public 公有访问.不受任何限制. private 私有访问. ...

  5. [git]基本用法1

    一.实验说明 本节实验为 Git 入门第一个实验,可以帮助大家熟悉如何创建和使用 git 仓库. 二.git的初始化 在使用git进行代码管理之前,我们首先要对git进行初始化. 1.Git 配置 使 ...

  6. iOS- Swift实现UITableView的常见操作

    1.前言   Swift在这就不多介绍了,想必大家都已皆知. 离Swift面世也过了有一个多月的时间. 在闲暇时间我用Swift实现了UITableView的一些常见操作. 基本都是可以用上的,今天在 ...

  7. TCP系列21—重传—11、TLP

    一.介绍 Tail Loss Probe (TLP)是同样是一个发送端算法,主要目的是使用快速重传取代RTO超时重传来处理尾包丢失场景.在一些WEB业务中,如果TCP尾包丢失,如果依靠RTO超时进行重 ...

  8. OSG配置捷径,VS2013+WIN10

    在自己电脑上用CMAKE已经编译好了,上传到百度云里面了. 环境是WIN10+VS2013. 链接:http://pan.baidu.com/s/1hrO7GFE 密码:fwkw 解压之后放在C盘或者 ...

  9. 3dContactPointAnnotationTool开发日志(六)

      一种可行的思路就是枚举一个模型的三角面片,然后判断三角形是否与另一个物体相交即可.为了让效果更好我想只渲染模型的线框.   在网上查了半天好像Unity里都没有自带的方便的渲染线框的方式,我又自己 ...

  10. week1 四人小组项目

    小组名称:nice! 项目组长:李权 组员:于淼 刘芳芳 杨柳 项目选题:东北师范大学论坛 作为东北师范大学同学间的信息交流平台,要满足的需求如下: 1.校内信息及公告 2.毕业生招聘信息 3.课程查 ...