题目描述
序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据。
请设计一个算法来实现二叉树的序列化与反序列化。这里不限定你的序列 / 反序列化算法执行逻辑,你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构。
你可以将以下二叉树:
1
/ \
2 3
/ \
4 5
序列化为 "[1,2,3,null,null,4,5]"
解题思路
所以我们可以自己设计null节点的表示方式 和 用什么将节点和节点之间隔开。
就依照题目建议的选择用字符串"null"表示null节点,用逗号","将节点隔开,用前序遍历
所以这棵树的序列就是 "1,2,null,null,3,4,null,null,5,null,null"
反序列化的时候就根据序列化得到的字符串和规则恢复这棵树。
package leetcode_3;
import java.util.ArrayList;
import java.util.List;
public class LeetCode297_serialize {
public static void main(String[] args) {
/*
1
/ \
2 3
/ \
4 5
*/
TreeNode a = new TreeNode(1);
TreeNode b = new TreeNode(2);
TreeNode c = new TreeNode(3);
TreeNode d = new TreeNode(4);
TreeNode e = new TreeNode(5);
a.left = b;
a.right = c;
c.left = d;
c.right = e;
String serializeStr = new LeetCode297_serialize().serialize(a);
System.out.println(serializeStr); //1,2,null,null,3,4,null,null,5,null,null,
TreeNode res = new LeetCode297_serialize().deserialize(serializeStr);
}
// Encodes a tree to a single string.
public String serialize(TreeNode root) {
StringBuffer sb = new StringBuffer();
ser(root,sb);
return sb.toString();
}
//前序遍历 序列化
private void ser(TreeNode root,StringBuffer sb){
if (root == null){
sb.append("null");
sb.append(",");
}else{
sb.append(root.val);
sb.append(",");
ser(root.left,sb);
ser(root.right,sb);
}
}
// Decodes your encoded data to tree.
public TreeNode deserialize(String data) {
String[] stringArray = data.split(",");
ArrayList<String> list = new ArrayList<>();
for (String str : stringArray){ // 手动数组转list
list.add(str);
}
TreeNode res = deser(list);
return res;
}
private TreeNode deser(List list){
TreeNode root = null;
if (list.get(0).equals("null")){
list.remove(0);
return null;
}
root = new TreeNode(Integer.parseInt((String)list.remove(0))); //object 转 int
root.left = deser(list);
root.right = deser(list);
return root;
}
}