本文最后更新于 1119 天前,其中的信息可能已经有所发展或是发生改变。
思路
-
使用前序遍历序列化,遍历的元素往链表末尾添加,根节点先添加,再左子节点,右子节点。所以根节点在链表头部,有了这个信息就好做了,毕竟二叉树的遍历就是找到根节点+做点啥+递归。
-
使用前序遍历反序列化,需要先得出根节点,在链表的头部,将其抛出。再找出左子节点,还是链表的头部,将其抛出,继续寻找左子节点的左子节点。。。
-
中序遍历无法反序列化,因为根节点不在链表头部or尾部,所以无法定位根节点。
-
拼接字符串时使用
StringBuilder
,性能,内存占用都好很多。- 使用
String
解答成功: 执行耗时:22 ms,击败了34.30% 的Java用户 内存消耗:41.5 MB,击败了8.19% 的Java用户
- 使用
StringBuilder
解答成功: 执行耗时:10 ms,击败了78.18% 的Java用户 内存消耗:39.8 MB,击败了93.36% 的Java用户
- 使用
题目
序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据。
请设计一个算法来实现二叉树的序列化与反序列化。这里不限定你的序列 / 反序列化算法执行逻辑,你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构。
提示: 输入输出格式与 LeetCode 目前使用的方式一致,详情请参阅 LeetCode 序列化二叉树的格式。你并非必须采取这种方式,你也可以采用其他的方法解决这个问题。
示例 1:
输入:root = [1,2,3,null,null,4,5] 输出:[1,2,3,null,null,4,5]
示例 2:
输入:root = [] 输出:[]
示例 3:
输入:root = [1] 输出:[1]
示例 4:
输入:root = [1,2] 输出:[1,2]
提示:
- 树中结点数在范围
[0, 104]
内 -1000 <= Node.val <= 1000
Related Topics
代码
class Codec {
private String SEP = ",";
private String NULL = "#";
// Encodes a tree to a single string.
public String serialize(TreeNode root) {
if (root == null) {
return NULL;
}
StringBuilder sb = new StringBuilder();
serialize(root, sb);
return sb.toString();
}
public void serialize(TreeNode root,StringBuilder sb) {
if (root == null) {
sb.append(NULL);
}
String left = serialize(root.left);
String right = serialize(root.right);
sb.append(root.val).append(SEP)
.append(left).append(SEP)
.append(right);
}
// Decodes your encoded data to tree.
public TreeNode deserialize(String data) {
if (NULL.equals(data)) {
return null;
}
LinkedList<String> nodes = new LinkedList<>(Arrays.asList(data.split(SEP)));
return deserialize(nodes);
}
private TreeNode deserialize(LinkedList<String> nodes) {
if (nodes.isEmpty()) {
return null;
}
String currValue = nodes.pop();
if (NULL.equals(currValue)) {
return null;
}
TreeNode currNode = new TreeNode(Integer.parseInt(currValue));
TreeNode leftNode = deserialize(nodes);
TreeNode rightNode = deserialize(nodes);
currNode.left = leftNode;
currNode.right = rightNode;
return currNode;
}
}