树的序列化和反序列化之三
一颗普通树进行序列化和反序列化的算法,第三次写这个算法了,感觉更精简了
测试用例:
Client ct = new Client();
TreeNode tn = ct.unserialize("1;2,3,4;null:5,6:null;null:7,8");
System.out.println(ct.serializeTree(tn));
import java.util.List;
import java.util.ArrayList;
public class TreeNode {
public int val;
public List<TreeNode> childs;
public TreeNode(int x) {
val = x;
}
}
public String serializeTree(TreeNode node) {
Queue<TreeNode> outQueue = new LinkedList<>();
outQueue.offer(node);
String result = node.val + ";";
while(!outQueue.isEmpty()){
Queue<TreeNode> inQueue = new LinkedList<>();
while(!outQueue.isEmpty()){
inQueue.offer(outQueue.poll());
}
String rowStr = "";
boolean isActivedRow = false;
while(!inQueue.isEmpty()){
TreeNode oneNode = inQueue.poll();
//每次都是处理oneNode的儿子节点
List<TreeNode> childs = oneNode.childs;
if(childs != null){
for(TreeNode c : childs){
rowStr += c.val + ",";
//把子节点加入queue中
outQueue.offer(c);
if(!isActivedRow && c != null){
isActivedRow = true;
}
}
}else{
rowStr += "null,";
}
//分号结尾
rowStr = rowStr.substring(0, rowStr.length() - 1) + ":";
}
//每一行是分号结尾,如果下一轮没有有效的节点则清空outQueue,并不加入到result中
if(isActivedRow){
result += rowStr.substring(0, rowStr.length() - 1) + ";";
}
}
result = result.substring(0, result.length() - 1);
return result;
}
public TreeNode unserialize(String str){
String[] strs = str.split(";");
//实例化根节点
TreeNode root = new TreeNode(Integer.valueOf(strs[0]));
//遍历
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root);
int len = strs.length;
for(int i = 1; i < len; i++){
String rowStr = strs[i];
String[] rowStrs = rowStr.split(":");
for(String groupStr : rowStrs){
TreeNode parentNode = queue.poll();
if("null".equals(groupStr)){
continue;
}
String[] groupStrs = groupStr.split(",");
for(String e : groupStrs){
TreeNode eNode = new TreeNode(Integer.valueOf(e));
if(parentNode.childs == null){
parentNode.childs = new ArrayList<>();
}
parentNode.childs.add(eNode);
queue.offer(eNode);
}
}
}
return root;
}


被折叠的 条评论
为什么被折叠?



