请实现两个函数,分别用来序列化和反序列化二叉树 二叉树的序列化是指:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字符串,从而使得内存中建立起来的二叉树可以持久保存。序列化可以基于先序、中序、后序、层序的二叉树遍历方式来进行修改,序列化的结果是一个字符串,序列化时通过 某种符号表示空节点(#),以 ! 表示一个结点值的结束(value!)。 二叉树的反序列化是指:根据某种遍历顺序得到的序列化字符串结果str,重构二叉树。 例如,我们可以把一个只有根节点为1的二叉树序列化为"1,",然后通过自己的函数来解析回这个二叉树
方法一
序列化:广度优先遍历二叉树,层次遍历打印,将字符通过StringBuilder存储成字符串。
反序列化:将数组通过split以","为界进行字符串拆分,生成String[],将每个成员输入进TreeNode[]中,再将TreeNode[]中元素进行二叉树排序。
import java.util.Queue;
import java.util.LinkedList;
public class Solution {//序列化
String Serialize(TreeNode root) {
Queue<TreeNode> queue = new LinkedList<TreeNode>();
StringBuilder sb = new StringBuilder();
if(root != null)queue.add(root);
while(!queue.isEmpty()){
TreeNode temp = queue.poll();
if(temp != null){//若不为空,则将左右子树添加至队列
queue.offer(temp.left);
queue.offer(temp.right);
sb.append(temp.val+",");
}else{
sb.append("#"+",");
}
}
if(sb.length() != 0)sb.deleteCharAt(sb.length()-1);
return sb.toString();
}
TreeNode Deserialize(String str) {//反序列化
TreeNode head = null;
if(str == null || str.length() == 0)return head;
String[] strings = str.split(",");
TreeNode[] treenodes = new TreeNode[strings.length];
for(int x=0;x<strings.length;x++){
if(!strings[x].equals("#")){
treenodes[x] = new TreeNode(Integer.valueOf(strings[x]));
}
}
for(int i=0,j=1;j<treenodes.length;i++){
if(treenodes[i] != null){
treenodes[i].left = treenodes[j++];
treenodes[i].right = treenodes[j++];
}
}
return treenodes[0];
}
}