基本思路为:通过Queue实现层次遍历,将遍历的节点的val用StringBuffer储存起来,null用null代替。中间用",“连接,最后用”[]'括起来,返回对应字符串,实现序列化。
反序列化相反,用Queue实现层次遍历。将字符串外面的括号去掉,然后通过",“split成一个字符串数组。每遍历一个节点,进行判断,若数组中的下一个字符串不为"null”,就把该字符串封装成对应的TreeNode节点,赋值给left节点,并将数组指针向后移一位。同理对right节点做相同操作,最终实现反序列化。
public class Codec {
// Encodes a tree to a single string.
public String serialize(TreeNode root) {
if(root == null) return "[]";
StringBuffer res = new StringBuffer("[");
Queue<TreeNode> q = new LinkedList<>(){{add(root);}};
while(!q.isEmpty()){
TreeNode n = q.poll();
if(n != null) {
res.append(n.val + ",");
q.add(n.left);
q.add(n.right);
}else{
res.append("null,");
}
}
res.deleteCharAt(res.length() - 1);
res.append("]");
return res.toString();
}
// Decodes your encoded data to tree.
public TreeNode deserialize(String data) {
if("[]".equals(data)) return null;
String[] nodes = data.substring(1,data.length() - 1).split(",");
TreeNode head = new TreeNode(Integer.parseInt(nodes[0]));
Queue<TreeNode> q = new LinkedList<>(){{add(head);}};
int i = 1;
while(!q.isEmpty()){
TreeNode n = q.poll();
if(!"null".equals(nodes[i])){
n.left = new TreeNode(Integer.parseInt(nodes[i]));
}
i++;
if(!"null".equals(nodes[i])){
n.right = new TreeNode(Integer.parseInt(nodes[i]));
}
i++;
}
return head;
}
}