思想:序列化与反序列化的方式要保证一致,也就是采用同样的方法去序列化和反序列化一颗二叉树
这里采用层次遍历去序列化一颗二叉树
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Codec {
// Encodes a tree to a single string.
//先层次遍历
public String serialize(TreeNode root) {
if(root==null) return "";
StringBuilder sb = new StringBuilder("[");
LinkedList<TreeNode> queue = new LinkedList<>();
queue.add(root);
while(!queue.isEmpty()){
TreeNode temp = queue.removeFirst();
if(temp!=null){
sb.append(temp.val);
queue.add(temp.left);
queue.add(temp.right);
}else{
sb.append("null");
}
sb.append(",");
}
//格式化输入
sb.deleteCharAt(sb.length()-1);//移除最后一个','
sb.append("]");
return sb.toString();
}
// Decodes your encoded data to tree.
//再用同样的方式进行反序列化。这里同样利用层次遍历去还原二叉树
public TreeNode deserialize(String data) {
if(data.equals("null")||data.isEmpty()) return null;
String[] nodeVal = data.substring(1,data.length()-1).split(",");
LinkedList<TreeNode> queue = new LinkedList<>();
int idx = 0;
TreeNode root = buildTreeNode(nodeVal[idx++]);
queue.add(root);
while(!queue.isEmpty()){
TreeNode temp = queue.removeFirst();
temp.left = buildTreeNode(nodeVal[idx++]);
temp.right = buildTreeNode(nodeVal[idx++]);
//只用构造非空结点
if(temp.left!=null){
queue.add(temp.left);
}
if(temp.right!=null){
queue.add(temp.right);
}
}
return root;
}
public TreeNode buildTreeNode(String val){
if(val.equals("null")) return null;
return new TreeNode(Integer.parseInt(val));
}
}
// Your Codec object will be instantiated and called as such:
// Codec codec = new Codec();
// codec.deserialize(codec.serialize(root));