1. 二叉树的序列化与反序列化
//序列化
public String serialize(TreeNode root) {
if(root == null) return "#";
return root.val + "!" + serialize(root.left) + "!" + serialize(root.right);
}
// 反序列化
public TreeNode deserialize(String data) {
String[] str = data.split("!");
List<String> list = new LinkedList<>(Arrays.asList(str));
return deserialize(list);
}
public TreeNode deserialize(List<String> list){
if(list.get(0).equals("#")){
list.remove(0);
return null;
}
int val = Integer.parseInt(list.get(0));
TreeNode root = new TreeNode(val);
list.remove(0);
root.left = deserialize(list);
root.right = deserialize(list);
return root;
}
2. N叉树的序列化与反序列化
序列化:记录每一个节点值,别在其后记录其孩子个数,各个数值之间用逗号隔开
反序列化:把数值添加到队列中,逐个取出
class Node{
int val;
List<Node> children;
Node(){}
Node(int val, List<Node> children){
this.val = val;
this.children = children;
}
}
class code{
//序列化
public String serialize(Node root){
if(root == null) return "";
List<String> list = new LinkedList<>();
buildString(root, list);
return String.join(",", list);
}
public void buildString(Node root, List<String> list){
if(root == null) return;
list.add(String.valueOf(root.val)); //添加节点值
list.add(String.valueOf(root.children.size())); //添加节点的孩子数目
for(Node child: root.children){
buildString(child, list);
}
}
//反序列化
public Node deserialize(String data){
if(data.length() == 0) return null;
String[] str = data.split(",");
Queue<String> queue = new LinkedList<>();
Collections.addAll(queue, str);
return buildTree(queue);
}
public Node buildTree(Queue<String> queue){
Node root = new Node();
root.val = Integer.parseInt(queue.poll());
int size = Integer.parseInt(queue.poll());
root.children = new ArrayList<>(size);
for(int i = 0; i < size; i++){
root.children.add(buildTree(queue));
}
return root;
}
}