题目

二叉树的序列化和反序列化

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

如何反序列化或序列化二叉树是没有限制的,你只需要确保可以将二叉树序列化为一个字符串,并且可以将字符串反序列化为原来的树结构。

样例

给出一个测试数据样例, 二叉树{3,9,20,#,#,15,7},表示如下的树结构:

  1. 3
  2. / \
  3. 9 20
  4. / \
  5. 15 7

我们的数据是进行BFS遍历得到的。当你测试结果wrong answer时,你可以作为输入调试你的代码。

你可以采用其他的方法进行序列化和反序列化。

解题

参考九章程序

看看注释就理解了,但是我表示自己想不出来Java

  1. /**
  2. * Definition of TreeNode:
  3. * public class TreeNode {
  4. * public int val;
  5. * public TreeNode left, right;
  6. * public TreeNode(int val) {
  7. * this.val = val;
  8. * this.left = this.right = null;
  9. * }
  10. * }
  11. */
  12. class Solution {
  13. /**
  14. * This method will be invoked first, you should design your own algorithm
  15. * to serialize a binary tree which denote by a root node to a string which
  16. * can be easily deserialized by your own "deserialize" method later.
  17. */
  18. public String serialize(TreeNode root) {
  19. // write your code here
  20. if( root == null)
  21. return "{}";
  22. ArrayList<TreeNode> queue = new ArrayList<TreeNode>();
  23. queue.add(root);
  24. // 将二叉树的个节点按照从上到下、从左到有的存储在queue中
  25. for(int i=0;i<queue.size();i++){
  26. TreeNode q = queue.get(i);
  27. if(q== null)
  28. continue;
  29. queue.add(q.left);
  30. queue.add(q.right);
  31. }
  32. // 去除叶子节点的左右孩子,这个孩子是空值
  33. while(queue.get(queue.size() - 1) == null){
  34. queue.remove(queue.size() - 1);
  35. }
  36. // 遍历queue把转换成字符串
  37. StringBuilder sb = new StringBuilder();
  38. sb.append("{");
  39. sb.append(queue.get(0).val);
  40. for(int i=1;i<queue.size(); i++){
  41. TreeNode q = queue.get(i);
  42. if(q!= null){
  43. sb.append(",");
  44. sb.append(q.val);
  45. }else{
  46. sb.append(",#");
  47. }
  48. }
  49. sb.append("}");
  50. return sb.toString();
  51. }
  52.  
  53. /**
  54. * This method will be invoked second, the argument data is what exactly
  55. * you serialized at method "serialize", that means the data is not given by
  56. * system, it's given by your own serialize method. So the format of data is
  57. * designed by yourself, and deserialize it here as you serialize it in
  58. * "serialize" method.
  59. */
  60. public TreeNode deserialize(String data) {
  61. // write your code here
  62. if(data == "{}")
  63. return null;
  64. // 以逗号分割
  65. String[] vals = data.substring(1,data.length()-1).split(",");
  66. ArrayList<TreeNode> queue = new ArrayList<TreeNode>();
  67. // 根节点
  68. TreeNode root = new TreeNode(Integer.parseInt(vals[0]));
  69. queue.add(root);
  70. int index = 0;
  71. boolean isLeftChild = true;
  72. for (int i = 1; i < vals.length; i++) {
  73. if (!vals[i].equals("#")) {
  74. TreeNode node = new TreeNode(Integer.parseInt(vals[i]));
  75. if (isLeftChild) {
  76. queue.get(index).left = node;
  77. } else {
  78. queue.get(index).right = node;
  79. }
  80. queue.add(node);
  81. }
  82. if (!isLeftChild) {
  83. index++;
  84. }
  85. isLeftChild = !isLeftChild;
  86. }
  87. return root;
  88. }
  89. }

lintcode : 二叉树的序列化和反序列化的更多相关文章

  1. [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 ...

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

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

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

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

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

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

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

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

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

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

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

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

  8. leetcode 297二叉树的序列化与反序列化

    to_string(x) 将数字x转化为string atoi(x) 将char转化为int stoi(x) 将string 转化为int 采用中序遍历的顺序存储,NULL用#表示,以,分隔,O(n) ...

  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. 汇编语言-求X的阶乘

    1. 题目:求X的阶乘值 2. 要求:输入一个整型数(不超过10),求出其阶乘值后输出,求阶乘的算法用子程序来实现. 3. 提示:可以用递归来实现,也可以用简单的循环来实现. 这里使用循环来实现: 对 ...

  2. isNotNull与isNotEmpty的区别

    <isNotNull> 检查属性是否不为null <isNotEmpty> 检查Collection.size()的值,属性的String或String.valueOf()值, ...

  3. Java包的命名规则

    按照惯例,包申明遵循特定的格式.虽然不是严格要求的Java语法,如果不遵循格式要求,大多数的Java认为你是不懂Java. 从右到左的顺序是: 1.systaxExample表明包的本地名称. 2.e ...

  4. Mongodb学习教程汇总

    1.MongoDB权威指南 - 学习笔记 地址:http://www.cnblogs.com/refactor/category/394801.html 2.8天学通MongoDB 地址:http:/ ...

  5. 如何修改 Discuz 门户文章页默认视频大小

    在 Discuz 系统中,论坛插入 Flash 等可以输入自定义的尺寸,但是门户文章页不可以修改.经过一番研究,找到了修改门户文章页默认视频大小的方法如下,希望对你有用:找到:/source/func ...

  6. 一道关于比赛胜负的Sql查询题目

    以前做过一道题目,一直没有来得及总结下来.贴图: 记得以前曾经找到了两种方法,今天试了一下,还是可以的,贴出过程: 下面是具体的查询方法: 原来放的是图片,今天又练习了一下,附代码: create T ...

  7. IDEA操作GIT说明

    公司的代码库从TFS升级到了GIT,我们的自动化测试代码就需要迁移到git上.操作如下: 1.安装GIT 安装完成后,在IDEA中配置git安装路径   2.在本地磁盘新建一个空目录,例如:D:\Wo ...

  8. iOS中使用自定义字体

    1.确定你的项目工程的Resources下有你要用的字体文件(.ttf或者.odf). 2.然后在你的工程的Info.plist文件中新建一行,添加key为:UIAppFonts,类型为Array或D ...

  9. php的public、protected、private三种访问控制模式的区别

    public: 公有类型 在子类中可以通过self::var调用public方法或属性,parent::method调用父类方法 在实例中可以能过$obj->var 来调用 public类型的方 ...

  10. [转载+原创]Emgu CV on C# (六) —— Emgu CV on Canny边缘检测

    Canny边缘检测也是一种边缘检测方法,本文介绍了Canny边缘检测的函数及其使用方法,并利用emgucv方法将轮廓检测解算的结果与原文进行比较. 图像的边缘检测的原理是检测出图像中所有灰度值变化较大 ...