树的序列化和反序列化
一颗普通树进行序列化和反序列化的算法
class Node {
public int val;
public List<Node> child;
public Node(int val){
this.val = val;
}
public Node(int val, List<Node> child){
this.val = val;
this.child = child;
}
}
//把树序列化为字符串
public static String serialize(Node root){
LinkedList<Node> queue = new LinkedList<>();
queue.add(root);
String result = "[" + root.val + "]";
while(!queue.isEmpty()){
String tmpResult = ":";
List<Node> nodes = new ArrayList<Node>();
while(!queue.isEmpty()){
nodes.add(queue.removeFirst());
}
String nodeStr;
for(Node node:nodes){
nodeStr = "";
if(node.child != null){
for(Node n:node.child){
nodeStr += nodeStr.equals("")?n.val:"," + n.val;
queue.add(n);
}
}
tmpResult += "[" + nodeStr + "]";
}
if(!queue.isEmpty()){
result += tmpResult;
}
}
return result;
}
//把字符串反序列化为树
public static Node unserialize(String str){
String[] splitStr = str.split(":");
Node result = null;
LinkedList<Node> queue = new LinkedList<>();
for(String row:splitStr){
String[] elems = row.split("]");
for(String elem:elems){
if(!elem.equals("[")){
String refElem = elem.replace("[", "");
String[] refElems = refElem.split(",");
ArrayList<Node> childs = new ArrayList<>();
for(String refEl:refElems){
Node node = new Node(Integer.valueOf(refEl));
childs.add(node);
queue.add(node);
}
if(result == null){
result = childs.get(0);
break;
}
Node parentNode = queue.removeFirst();
parentNode.child = childs;
}else{
queue.removeFirst();
}
}
}
return result;
}