1.什么叫二叉树的序列化和反序列化

我们在内存中建立起了一颗二叉树,当电脑关机后,内存中的东西又消失了,我们还得自己手工去建立。
①把内存中的二叉树存储到文件或其他介质中的过程我们叫序列化
②反序列化就是例如根据文件中的字符串的内容,把这个二叉树又重新构造起来。

2.二叉树的结构

struct NODE
{struct NODE *Left;struct NODE *Right;int Value;NODE(int v):Left(NULL), Right(NULL), Value(v){}
};


我们要将这么一颗二叉树序列化和反序列化(用先序 别的序列同理)

3.序列化

我们将一颗二叉树转化成字符串的形式

首先我们介绍二叉树先序序列化的方式,假设序列化的结果字符串为str,
初始时str等于空字符串。先序遍历二叉树,如果遇到空节点,就在str的末尾加上
“#_”,“#”表示这个节点为空,节点值不存在,当然你也可以用其他的特殊字符,
“_”表示一个值的结束。如果遇到不为空的节点,假设节点值为3,
就在str的末尾加上“3_”

那么上面那个二叉树就可表示为

"1_2_4_#_#_5_#_#_3_6_#_#_7_#_#_"
string MyItoA(int nNum)//将value转化为string
{string res;while(nNum){res += (nNum%10)+'0';nNum /= 10;}reverse(res.begin(), res.end());return res;
}void seralize(string &Str, NODE *Head)//给一个头结点 获取一个字符串
{if(NULL == Head)//空节点{Str += "#_";return;}Str += MyItoA(Head->Value);//"value_"的形式Str += "_";seralize(Str, Head->Left);//递归左和右seralize(Str, Head->Right);
}

4.反序列化

所谓反序列化是根据一个字符串重新建立一棵二叉树,反序列化是序列化的逆过程,对于一个字符串,首先按照分隔符_将其分割为字符串数组,每个字符串元素代表一个结点,然后开始重建二叉树。由于每个结点再字符串中只保留了一个val值,因此需要根据结点的值val重新构建Node结点对象,并且为这个结点对象的left和right进行赋值

//对字符串进行分割 然后存放到一个队列当中
void split (const string &Str, queue<string> & Queue)
{int i, j;string Temp;for(i = 0; '\0' != Str[i]; i++){if('_' == Str[i]){Queue.push(Temp);Temp = "";continue;}Temp+=Str[i];}}
//根据分割得到的队列 来重建树
NODE * ReconPreOrder(queue<string> & Queue)
{string Temp = Queue.front();Queue.pop();if('#' == Temp[0])//空节点{return NULL;}int Value = 0;for(int i = 0; '\0' != Temp[i]; i++)//获取value{Value = Value*10+ Temp[i]-'0';}NODE  *New = new NODE(Value);//创建根New->Left = ReconPreOrder(Queue);//创建左右子树New->Right = ReconPreOrder(Queue);return New;
}

5.运行

//先序遍历
void PreOrder(NODE *Head)
{if(NULL == Head)return;cout<<Head->Value<<" ";PreOrder(Head->Left);PreOrder(Head->Right);
}
int main(int argc, char** argv)
{string Str = "1_2_4_#_#_5_#_#_3_6_#_#_7_#_#_";  queue<string> Queue;split (Str, Queue);//划分NODE *Head = ReconPreOrder(Queue);//重建树PreOrder(Head);//先序遍历cout<<endl;string empty = "";seralize(empty, Head);//根据重建后的树 序列化cout<<empty<<endl;if(Str == empty)//比较两个字符串{cout<<"Equal"<<endl;}return 0;
}

实现二叉树的序列化和反序列化相关推荐

  1. [Java]LeetCode297. 二叉树的序列化与反序列化 | Serialize and Deserialize Binary Tree

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ ➤微信公众号:山青咏芝(shanqingyongzhi) ➤博客园地址:山青咏芝(https://www.cnblog ...

  2. python代码实现二叉树的序列化和反序列化

    python代码实现二叉树的序列化和反序列化 二叉树的序列化 二叉树的序列化是指:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字 符串,从而使得内存中建立起来的二叉树可以持久保存. 二叉树的反序 ...

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

    题目: 序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据. 请设计一个算法来 ...

  4. 算法练习day10——190328(二叉树的先序、 中序、 后序遍历, 包括递归方式和非递归方式、找到一个节点的后继节点、二叉树的序列化和反序列化)

    1.实现二叉树的先序. 中序. 后序遍历, 包括递归方式和非递归方式 1.1 访问节点的顺序 节点访问顺序如下图所示: 访问顺序:1 2 4 4 4 2 5 5 5 2 1 3 6 6 6 3 7 7 ...

  5. 【数据结构与算法】之深入解析“二叉树的序列化与反序列化”的求解思路与算法示例

    一.题目要求 序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据. 请设计一个 ...

  6. 数据结构与算法之二叉树的序列化和反序列化及判断一棵树是否为平衡二叉树

    数据结构与算法之二叉树的序列化和反序列化及判断一棵树是否为平衡而二叉树 目录 二叉树的序列化和反序列化 判断一棵树是否为平衡而二叉树 1. 二叉树的序列化和反序列化 1. 递归版本序列化和反序列化 代 ...

  7. 【LeetCode】【HOT】297. 二叉树的序列化与反序列化(BFS)

    [LeetCode][HOT]297. 二叉树的序列化与反序列化 文章目录 [LeetCode][HOT]297. 二叉树的序列化与反序列化 package hot;import java.util. ...

  8. lintcode 7. 二叉树的序列化和反序列化 Python代码

    '''7. 二叉树的序列化和反序列化 描述 设计一个算法,并编写代码来序列化和反序列化二叉树.将树写入一个文件被称为"序列化",读取文件后重建同样的二叉树被称为"反序列化 ...

  9. leetcode-017-297. 二叉树的序列化与反序列化

    我又又又开始刷题了... 不过这么一天两个小时,其实还是蛮浪费时间的,毕竟我对C++其实并不是特别熟悉,所以很多时候花费在语法上面的时间,就很磨人. 序列化是将一个数据结构或者对象转换为连续的比特位的 ...

  10. 一天一大 leet(二叉树的序列化与反序列化)难度:困难 DAY-16

    20200616 题目(难度:困难): 序列化是将一个数据结构或者对象转换为连续的比特位的操作, 进而可以将转换后的数据存储在一个文件或者内存中, 同时也可以通过网络传输到另一个计算机环境,采取相反方 ...

最新文章

  1. 机器学习项目模板:ML项目的6个基本步骤
  2. 在windows上使用virt-manager
  3. asp+Access程序在Windows Server 2003 Enterprise Edition服务器上运行时无法显示备注字段的解决方法...
  4. [00028]-[2015-09-23]-[00]-[VC 关于Excel操作的测试]
  5. 中国移动互联网趋势报告:教育、金融类App留存率更高
  6. 如何快速成长为技术大牛?
  7. Numpy中np.dot()与np.matmul()的区别(矩阵乘积、矩阵乘法、矩阵相乘)
  8. 微服务中集成分布式配置中心 Apollo
  9. c#泛型作为返回类型的写法
  10. 力压今日头条成 App Store 榜第一,个税 App 惊爆 62 例木马病毒!
  11. Atiti.ui原理与gui理论
  12. eclipse导入html页面乱码,Eclipse导入项目乱码问题(中文乱码)
  13. 2020区块链百强榜暨战疫优秀企业评选|链塔智库
  14. 计算机故障报警声2声,电脑开机报警声音2短4短是什么問題?
  15. WWW15年:改变世界的15个网站
  16. 字符个数统计(C++)
  17. CentOS Linux操作系统
  18. 崩坏3服务器维护2月8号,《崩坏3》2月8日更新内容 符华月轮正式上线
  19. Web服务小试——天气预报
  20. Vue 排序(上下箭头切换)

热门文章

  1. R绘图 第九篇:绘制散点图和气泡图(ggplot2)
  2. linux常用解压命令总结
  3. kafka搭建、学习(一)
  4. windows下怎么打开psql命令
  5. MSExchangeIS ID8528 日志提示邮箱已满报警
  6. Struts1和Struts2的特点、工作流程及差异性
  7. java web 分页 基于sql 2005 数据库
  8. Codejock Xtreme MFC 图形界面控件包
  9. 做一个管理者的学习之路--002
  10. 电商网站前台模板_电商热潮汹涌,兴长信达PEC零售商城系统为企业注入新力量...