- 题目:序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据。
请设计一个算法来实现二叉树的序列化与反序列化。这里不限定你的序列 / 反序列化算法执行逻辑,你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构。
示例:输入:root = [1,2,3,null,null,4,5]
输出:[1,2,3,null,null,4,5]
// 使用先序遍历序列化,下划线_代表一个节点的结束,#代表null
// Encodes a tree to a single string.
public String serialize(TreeNode root) {
if (root == null)
return "#_";
String res = root.val + "_";
res += serialize(root.left);
res += serialize(root.right);
return res;
}
// Decodes your encoded data to tree.
public TreeNode deserialize(String data) {
String[] strs = data.split("_");
Queue<String> queue = new LinkedList<>();
for (int i = 0; i < strs.length; i++){
queue.add(strs[i]);
}
return desByOrder(queue);
}
/**
* 用于辅助反序列化,迭代返回反序列化结果的头节点
* @param queue
* @return
*/
public TreeNode desByOrder(Queue<String> queue){
// 每次从queue中取出一个值
String value = queue.poll();
// 如果取值为#说明该节点应该为null,直接返回
if (value.equals("#")){
return null;
}
// 当前root设置为取出值
TreeNode root = new TreeNode(Integer.parseInt(value));
// 左右节点进去递归
root.left = desByOrder(queue);
root.right = desByOrder(queue);
return root;
}