本人电子系,只为一学生。心喜计算机,小编以怡情。
设计一个算法,并编写代码来序列化和反序列化二叉树。将树写入一个文件被称为“序列化”,读取文件后重建同样的二叉树被称为“反序列化”。
如何反序列化或序列化二叉树是没有限制的,你只需要确保可以将二叉树序列化为一个字符串,并且可以将字符串反序列化为原来的树结构。
您在真实的面试中是否遇到过这个题? Yes
样例
给出一个测试数据样例, 二叉树{3,9,20,#,#,15,7},表示如下的树结构:
3
/ \
9 20
/ \
15 7
我们的数据是进行BFS遍历得到的。当你测试结果wrong answer时,你可以作为输入调试你的代码。
你可以采用其他的方法进行序列化和反序列化。
思路:就延续[3,9,20,#,#,15,7]的方法设计
static public String serialize(TreeNode root) {
// write your code here
//层次遍历建立字符串,注意空为'#'
if(root==null) return new String();
Queue<TreeNode> temp=new LinkedList<>();
temp.offer(root);
String ret=root.val+",";
while(!temp.isEmpty())
{
TreeNode p=temp.poll();
if(p.left!=null)
{
temp.offer(p.left);
ret+=p.left.val+",";
}
else {
ret+="#,";
}
if(p.right!=null)
{
temp.offer(p.right);
ret+=p.right.val+",";
}
else {
ret+="#,";
}
//清除尾部 叶子节点引出的'#'
int i=ret.length()-1;
for(;i>=1;i--)
{
if(ret.charAt(i)!='#'&&ret.charAt(i)!=',')
break;
}
return ret.substring(0, i+1);
}
static public TreeNode deserialize(String data) {
// write your code here
if(data.length()==0) return null;
ArrayList<TreeNode> t1=new ArrayList<>();//建立树结点数组
//将字符串以','断成字符数组
String []sp=data.split(",");
for(int i=0;i<sp.length;i++)
{
//'#'无法用Integer.valueOf解析,我就用最大值来代替
if(sp[i].equals("#")) sp[i]=Integer.MAX_VALUE+"";
int temp=Integer.valueOf(sp[i]);
t1.add(new TreeNode(temp));//添加树结点
}
TreeNode head=t1.get(0);
//然后以i为当前的节点,j为游标,建立联系
for(int i=0,j=1;j<t1.size();i++)
{
TreeNode p=t1.get(i);
if(p.val==Integer.MAX_VALUE) continue;
//一定要检查j不要越界
if(j<t1.size())
{
if(t1.get(j).val==Integer.MAX_VALUE) j++;//是'#'不用管,默认null
else
p.left=t1.get(j++);//左节点
}
//同理
if(j<t1.size())
{
if(t1.get(j).val==Integer.MAX_VALUE) j++;
else
p.right=t1.get(j++);//又节点
}
}
return head;
}