to_string(x) 将数字x转化为string

atoi(x) 将char转化为int

stoi(x) 将string 转化为int

采用中序遍历的顺序存储,NULL用#表示,以,分隔,O(n)time O(n) space

  1. /**
  2. * Definition for a binary tree node.
  3. * struct TreeNode {
  4. * int val;
  5. * TreeNode *left;
  6. * TreeNode *right;
  7. * TreeNode(int x) : val(x), left(NULL), right(NULL) {}
  8. * };
  9. */
  10.  
  11. /**
  12. 使用先序递归序列来进行序列化与反序列化
  13. to_string转化为string以逗号分隔;递归终点x->val==NULL
  14.  
  15. getline(s,str,',');每次读取','之前的字符串;递归终点str=="#"
  16. **/
  17. class Codec {
  18. public:
  19.  
  20. // Encodes a tree to a single string.
  21. string serialize(TreeNode* root) {
  22. if(root==NULL)
  23. return "#";
  24. else
  25. return to_string(root->val)+","+serialize(root->left)+","+serialize(root->right);
  26. }
  27.  
  28. // Decodes your encoded data to tree.
  29. TreeNode* deserialize(string data) {
  30. if(data=="#")
  31. return NULL;
  32. stringstream s(data);
  33. return makedeserialize(s);
  34. }
  35. TreeNode* makedeserialize(stringstream&s){
  36. string str;
  37. getline(s,str,',');
  38. if(str=="#")
  39. return NULL;
  40.  
  41. TreeNode* root=new TreeNode(stoi(str));
  42. root->left=makedeserialize(s);
  43. root->right=makedeserialize(s);
  44.  
  45. return root;
  46. }
  47. };
  48.  
  49. // Your Codec object will be instantiated and called as such:
  50. // Codec codec;
  51. // codec.deserialize(codec.serialize(root));

采用层序遍历的顺序,储存每一层的值,不存在的或者NULL值用#代替,每个位置以'/'结束

  1. /**
  2. * Definition for a binary tree node.
  3. * struct TreeNode {
  4. * int val;
  5. * TreeNode *left;
  6. * TreeNode *right;
  7. * TreeNode(int x) : val(x), left(NULL), right(NULL) {}
  8. * };
  9. */
  10. class Codec {
  11. public:
  12.  
  13. // Encodes a tree to a single string.
  14. string serialize(TreeNode* root) {
  15. string res;
  16. queue<TreeNode*> q;
  17. q.push(root);
  18. int flag=;
  19. while(flag){
  20. flag=;
  21. int k=q.size();
  22. for(int i=;i<k;i++){
  23. TreeNode* p=q.front();
  24. q.pop();
  25. if(p==NULL){
  26. res.push_back('#');
  27. q.push(NULL);
  28. q.push(NULL);
  29. }else{
  30. int value=p->val;
  31. if(value<) {res.push_back('-');value=-value;}
  32. stack<char> s;
  33. if(value==) s.push('');
  34. while(value){
  35. int e=value%;
  36. s.push(e+'');value=value/;
  37. }
  38. while(!s.empty()){
  39. res.push_back(s.top());s.pop();
  40. }
  41. q.push(p->left);
  42. q.push(p->right);
  43. if(p->left||p->right) flag=;
  44. }
  45. res.push_back('/');
  46. }
  47. }
  48. cout<<res<<endl;
  49. return res;
  50. }
  51.  
  52. // Decodes your encoded data to tree.
  53. TreeNode* deserialize(string data) {
  54. if(data.size()==) return NULL;
  55. if(data.size()==&&data[]=='#')return NULL;
  56. int len=data.size();
  57. vector<TreeNode*> v;
  58. for(int i=;i<len;i++){
  59. if(data[i]=='/')continue;
  60. TreeNode* p=NULL;
  61.  
  62. if(data[i]!='#'){
  63. int value=;
  64. int flag=;
  65. if(data[i]=='-') {flag=-;i++;}
  66. while(data[i]!='/'){
  67. value=*value+data[i]-'';
  68. i++;
  69. }
  70. value=flag*value;
  71. p=new TreeNode(value);
  72. }
  73.  
  74. v.push_back(p);
  75. }
  76. for(int i=;i<(v.size()-)/;i++){
  77. if(v[i]!=NULL){
  78. v[i]->left=v[*i+];
  79. v[i]->right=v[*i+];
  80. }
  81. }
  82. return v[];
  83. }
  84. };
  85.  
  86. // Your Codec object will be instantiated and called as such:
  87. // Codec codec;
  88. // codec.deserialize(codec.serialize(root));

测试例子如下:

样例通过为47/48,一个深度为1000的偏二叉树没有通过;

leetcode 297二叉树的序列化与反序列化的更多相关文章

  1. Java实现 LeetCode 297 二叉树的序列化与反序列化

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

  2. Leetcode 297.二叉树的序列化和反序列化

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

  3. 【LeetCode】297. 二叉树的序列化与反序列化

    297. 二叉树的序列化与反序列化 知识点:二叉树:递归 题目描述 序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一 ...

  4. 297 Serialize and Deserialize Binary Tree 二叉树的序列化与反序列化

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

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

    Serialization is the process of converting a data structure or object into a sequence of bits so tha ...

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

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

  7. 二叉树的序列化和反序列化(Java)

    请实现两个函数,分别用来序列化和反序列化二叉树 序列化就是将二叉树以字符串输出,反序列化:根据自己输出的字符串,构建二叉树. 这里先序遍历输出,且为了方便反序列化,各个节点","隔 ...

  8. [LintCode] Serialize and Deserialize Binary Tree(二叉树的序列化和反序列化)

    描述 设计一个算法,并编写代码来序列化和反序列化二叉树.将树写入一个文件被称为“序列化”,读取文件后重建同样的二叉树被称为“反序列化”. 如何反序列化或序列化二叉树是没有限制的,你只需要确保可以将二叉 ...

  9. [LeetCode] 297. Serialize and Deserialize Binary Tree 二叉树的序列化和反序列化

    Serialization is the process of converting a data structure or object into a sequence of bits so tha ...

随机推荐

  1. Mongodb操作-更新操作符

    1.$inc 用法:{$inc:{field:value}} 作用:对一个数字字段的某个field增加value 示例:将name为chenzhou的学生的age增加5 > db.student ...

  2. 动画学习之Music图形绘制

    今天来实现一个类似于网易云音乐类似的动态效果,在用网易云音乐听歌时会有一个类似这样的效果,如下: 而咱们这次要实现的效果如下: music图形的绘制: 在实现动画之前先来将静态的图形绘制出来, 如下: ...

  3. Java I/O(三)各种Reader和Writer读写器、RandomAccessFile随机访问文件、序列化

    2019 01/01 八.Reader和Writer读写器 前面讲的输入输出流的基本单位都是字节,因此可以称为“字节流”,读写器是以字符为基本单位,可以称为“字符流”.它们的使用方法非常相似,因此我考 ...

  4. C语言|博客作业12—学期总结

    一.我学到的内容 二.我的收获 (1)https://edu.cnblogs.com/campus/zswxy/CST2019-4/homework/7603 收获:第一次接触C语言和写博客,感觉特别 ...

  5. DevExpress ASP.NET v19.1版本亮点:发布全新的Gantt控件

    行业领先的.NET界面控件DevExpress 发布了v19.1版本,本文将以系列文章的方式为大家介绍DevExpress ASP.NET Controls v19.1中新增的一些控件及增强的控件功能 ...

  6. Mac 安装RN android开发环境

    前言 前面介绍了MAC 安装,再来讲讲mac 安装 安卓的开发环境 首先貌似很多Mac自带安卓JDK ,你可以在终端上输入java -version 看是否已经有java开发环境. 如果没有java开 ...

  7. grunt-contrib-watch 实时监测文件状态

    grunt-contrib-watch:实时监测文件的增删改状态,状态改变时自动执行预定义任务使用watch时,被watch的文件可以分开写,这样可以提高watch的性能,不用每次把没修改的文件也执行 ...

  8. 【JZOJ5430】【NOIP2017提高A组集训10.27】图

    题目 有一个n个点的无向图,给出m条边,每条边的信息形如\(<x,y,c,r>\) 给出q组询问形如\(<u,v,l,r>\) 接下来解释询问以及边的意义 询问表示,一开始你在 ...

  9. Python 异常处理Ⅳ

    异常的参数 一个异常可以带上参数,可作为输出的异常信息参数. 你可以通过except语句来捕获异常的参数,如下所示: 变量接收的异常值通常包含在异常的语句中.在元组的表单中变量可以接收一个或者多个值. ...

  10. jprofiler 监听远程java项目

    1.下载.安装windows和linux版的jprofile.注意:若监控的是springboot.springcloud项目,切记本地和服务器上的jprofile要版本保持一致,本人亲自踩过坑. 官 ...