32.序列化和反序列化二叉树
请实现两个函数,分别用来序列化和反序列化二叉树。
您需要确保二叉树可以序列化为字符串,并且可以将此字符串反序列化为原始树结构。
样例
你可以序列化如下的二叉树
8
/ \
12 2
/ \
6 4
为:"[8, 12, 2, null, null, 6, 4, null, null, null, null]"
注意:
- 以上的格式是AcWing序列化二叉树的方式,你不必一定按照此格式,所以可以设计出一些新的构造方式。
思路
首先记住一句话,怎么序列化的就怎么反序列化。例如我用前序遍历的方式序列化,就要用前序便利的方式反序列化。
我们规定字符串“#”表示一个空节点,root.val的字符串是这个节点序列化的值。每个节点(包括空节点)都需要以“!”分隔,这是为了防止错乱,保证反序列化时二叉树的唯一性。
class Solution {
//规定!标识一个节点结束,#标识空节点
// Encodes a tree to a single string.
String serialize(TreeNode root) {
if(root==null)
{
return"#!";
}
String str=root.val+"!";
str+=serialize(root.left);
str+=serialize(root.right);
return str;
}
// Decodes your encoded data to tree.
TreeNode deserialize(String data) {
//字符串分割,返回一个字符串数组
String[] str=data.split("!");
//构造先序遍历队列
Queue<String> queue=new LinkedList<>();
for(int i=0;i<str.length;i++)
{
queue.add(str[i]);
}
return deserialize(queue);
}
public TreeNode deserialize(Queue<String> queue)
{
String str=queue.remove();
if(str.equals("#"))
{
return null;
}
TreeNode root=new TreeNode(Integer.valueOf(str));
root.left=deserialize(queue);
root.right=deserialize(queue);
return root;
}
}