LeetCode297-二叉树的序列化与反序列化

题目链接

英文链接:https://leetcode.com/problems/serialize-and-deserialize-binary-tree/

中文链接:https://leetcode-cn.com/problems/serialize-and-deserialize-binary-tree/

题目详述

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

请设计一个算法来实现二叉树的序列化与反序列化。这里不限定你的序列 / 反序列化算法执行逻辑,你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构。

示例:

1
2
3
4
5
6
7
8
9
你可以将以下二叉树:

1
/ \
2 3
/ \
4 5

序列化为 "[1,2,3,null,null,4,5]"

提示: 这与 LeetCode 目前使用的方式一致,详情请参阅 LeetCode 序列化二叉树的格式。你并非必须采取这种方式,你也可以采用其他的方法解决这个问题。

说明: 不要使用类的成员 / 全局 / 静态变量来存储状态,你的序列化和反序列化算法应该是无状态的。

题目详解

  • _ 分割结点,用 # 表示 null
  • 采用一种方式进行序列化,就采用相同的方式进行反序列化。
  • 下面是采用先序遍历序列化与反序列化的结果。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
public class LeetCode_00297 {

public class Codec {

// Encodes a tree to a single string.
public String serialize(TreeNode root) {
StringBuilder sb = new StringBuilder();
encode(root, sb);
return sb.toString();
}

private void encode(TreeNode root, StringBuilder sb) {
if (root == null) {
sb.append("#_");
return;
}
sb.append(root.val).append('_');
encode(root.left, sb);
encode(root.right, sb);
}

// Decodes your encoded data to tree.
public TreeNode deserialize(String data) {
String[] s = data.split("_");
int[] index = new int[]{0};
return decode(s, index);
}

private TreeNode decode(String[] s, int[] index) {
if ("#".equals(s[index[0]])) {
++index[0];
return null;
}
TreeNode root = new TreeNode(Integer.parseInt(s[index[0]++]));
root.left = decode(s, index);
root.right = decode(s, index);
return root;
}
}
}