序列化:使用队列储存每个节点
反序列化:
使用队列和指针,指针指向队列首节点的左子树,然后指针向后移动一次,指针指向队列首节点的右子树,出队列并指针+1,此时指针又指向队列首节点的左子树;
队列只存储有值得树
public class Codec {
// Encodes a tree to a single string.
public String serialize(TreeNode root) {
if(root == null) return "[]";
Queue<TreeNode> queue = new LinkedList<>();
StringBuilder res = new StringBuilder("[");
int number = 0;
queue.add(root);
while(!queue.isEmpty()){
root = queue.poll();
if(root == null){
res.append("null,");
}else{
res.append(root.val + ",");
queue.add(root.left);
queue.add(root.right);
number = res.length();
}
}
res.delete(number - 1, res.length());
res.append("]");
return res.toString();
}
// Decodes your encoded data to tree.
public TreeNode deserialize(String data) {
if(data.equals("[]")) return null;
String[] vals = data.substring(1, data.length() - 1).split(",");
TreeNode root = new TreeNode(Integer.parseInt(vals[0]));
int number = vals.length;
Queue<TreeNode> queue = new LinkedList<>();
queue.add(root);
int i = 1;
while(i < number){
TreeNode node = queue.poll();
if(!vals[i].equals("null")) {
node.left = new TreeNode(Integer.parseInt(vals[i]));
queue.add(node.left);
}
i++;
if(i == number) break;
if(!vals[i].equals("null")) {
node.right = new TreeNode(Integer.parseInt(vals[i]));
queue.add(node.right);
}
i++;
}
return root;
}
}