序列化二叉树
序列化二叉树
请实现两个函数,分别用来序列化和反序列化二叉树
二叉树的序列化是指:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字符串,从而使得内存中建立起来的二叉树可以持久保存。序列化可以基于先序、中序、后序、层序的二叉树遍历方式来进行修改,序列化的结果是一个字符串,序列化时通过 某种符号表示空节点(#),以 ! 表示一个结点值的结束(value!)。
二叉树的反序列化是指:根据某种遍历顺序得到的序列化字符串结果str,重构二叉树。
/*
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
/*
这里我使用层序
*/
import java.util.*;
public class Solution {
String Serialize(TreeNode root) {
if(root==null){
return "";
}
Queue<TreeNode>queue=new LinkedList<TreeNode>();
queue.offer(root);
String ans="";
ans+=root.val;
ans+=",";
while(!queue.isEmpty()){
TreeNode treenode=queue.poll();
if(treenode.left!=null){
queue.offer(treenode.left);
ans+=treenode.left.val;
}else{
ans+="#";
}
ans+=",";
if(treenode.right!=null){
queue.offer(treenode.right);
ans+=treenode.right.val;
}else{
ans+="#";
}
ans+=",";
}
return ans.substring(0,ans.length()-1);
}
TreeNode Deserialize(String str) {
if(str.length()==0){
return null;
}
String[]nodes=str.split(",");
int index=0;
int length=nodes.length;
Queue<TreeNode>save=new LinkedList<TreeNode>();
TreeNode root=new TreeNode(Integer.valueOf(nodes[0]));
save.offer(root);
index++;
while(index<length){
TreeNode temp=save.poll();
if(nodes[index].equals("#")){
temp.left=null;
}else{
temp.left=new TreeNode(Integer.valueOf(nodes[index]));
save.offer(temp.left);
}
index++;
if(index>=length){
break;
}
if(nodes[index].equals("#")){
temp.right=null;
}else{
temp.right=new TreeNode(Integer.valueOf(nodes[index]));
save.offer(temp.right);
}
index++;
}
return root;
}
}
可以看到,层序的序列化和反序列化都是借助一个队列实现的

浙公网安备 33010602011771号