题目
序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据。
请设计一个算法来实现二叉树的序列化与反序列化。这里不限定你的序列 / 反序列化算法执行逻辑,你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构。链接
思路
广度优先的应用,只需在存储字符串的时候加分隔符。
/**
* 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) {
StringBuilder sb= new StringBuilder();
Queue<TreeNode>queue = new LinkedList<>();
queue.offer(root);
while(!queue.isEmpty()){
TreeNode t = queue.poll();
if(t != null){
sb.append(t.val + ",");
queue.offer(t.left);
queue.offer(t.right);
}else{
sb.append("null,");
}
}
return sb.toString();
}
// Decodes your encoded data to tree.
public TreeNode deserialize(String data) {
String[]node = data.split(",");
TreeNode root = null;
if(node.length>0){
root = getNode(node[0]);
int idx = 1;
Queue<TreeNode>queue = new LinkedList<>();
queue.offer(root);
while(idx<node.length){
TreeNode t = queue.poll();
if(t != null){
t.left = getNode(node[idx++]);
t.right = getNode(node[idx++]);
queue.offer(t.left);
queue.offer(t.right);
}
}
}
return root;
}
TreeNode getNode(String s){
if(s.equals("null")){
return null;
}else{
return new TreeNode(Integer.valueOf(s));
}
}
}