题目详述
序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据。
请设计一个算法来实现二叉树的序列化与反序列化。这里不限定你的序列 / 反序列化算法执行逻辑,你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构。
示例:
你可以将以下二叉树:
序列化为 “[1,2,3,null,null,4,5]”
解法
前序遍历的DFS。时间复杂度:O(n),空间复杂度:O(n)
public class Codec {
// Encodes a tree to a single string.
//序列化
public String serialize(TreeNode root) {
StringBuilder res = reserialize(root, new StringBuilder());
return res.toString();
}
public StringBuilder reserialize(TreeNode root, StringBuilder str) {
if (root == null) str.append("null,");
else {
str.append(root.val);
str.append(",");
reserialize(root.left, str);
reserialize(root.right, str);
}
//System.out.println("str="+str);
return str;
}
// Decodes your encoded data to tree.
// 反序列化
public TreeNode deserialize(String data) {
String[] data_array = data.split(",");
List<String> data_list = new LinkedList<String>(Arrays.asList(data_array));
return rdeserialize(data_list);
}
public TreeNode rdeserialize(List<String> l) {
if (l.get(0).equals("null")) {
l.remove(0);
return null;
}
TreeNode root = new TreeNode(Integer.valueOf(l.get(0)));
l.remove(0);
root.left = rdeserialize(l);
root.right = rdeserialize(l);
return root;
}
}