二叉树的序列化和反序列化
题目
设计一个算法,并编写代码来序列化和反序列化二叉树。将树写入一个文件被称为“序列化”,读取文件后重建同样的二叉树被称为“反序列化”。
如何反序列化或序列化二叉树是没有限制的,你只需要确保可以将二叉树序列化为一个字符串,并且可以将字符串反序列化为原来的树结构。样例
给出一个测试数据样例, 二叉树{3,9,20,#,#,15,7},表示如下的树结构:
我们的数据是进行BFS遍历得到的。当你测试结果wrong answer时,你可以作为输入调试你的代码。
你可以采用其他的方法进行序列化和反序列化。题解
本题的序列化和反序列化都是二叉树的层序遍历问题,使用队列解决。先将头结点入列,将节点值序列化,再将其出列的同时检查其左右子节点是否为null,如不为null则入列,否则仅序列化即可,直至遍历完毕。
/**
* Definition of TreeNode:
* public class TreeNode {
* public int val;
* public TreeNode left, right;
* public TreeNode(int val) {
* this.val = val;
* this.left = this.right = null;
* }
* }
*/
class Solution {
/**
* This method will be invoked first, you should design your own algorithm
* to serialize a binary tree which denote by a root node to a string which
* can be easily deserialized by your own "deserialize" method later.
*/
public String serialize(TreeNode root) {
Queue<TreeNode> queue = new LinkedList<TreeNode>();
StringBuilder sb = new StringBuilder("");
if (root == null)
{
return sb.toString();
}
queue.add(root);
sb.append(String.valueOf(root.val) + ",");
while (!queue.isEmpty())
{
TreeNode t = queue.poll();
if (t.left != null)
{
queue.add(t.left);
}
sb.append(t.left == null ? "#," : String.valueOf(t.left.val) + ",");
if (t.right != null)
{
queue.add(t.right);
}
sb.append(t.right == null ? "#" : String.valueOf(t.right.val));
if (!queue.isEmpty())
{
sb.append(",");
}
}
return sb.toString();
}
/**
* This method will be invoked second, the argument data is what exactly
* you serialized at method "serialize", that means the data is not given by
* system, it's given by your own serialize method. So the format of data is
* designed by yourself, and deserialize it here as you serialize it in
* "serialize" method.
*/
public TreeNode deserialize(String data) {
if (data.equals(""))
{
return null;
}
String[] nodeArr = data.split(",");
TreeNode root = new TreeNode(Integer.valueOf(nodeArr[0]));
Queue<TreeNode> queue = new LinkedList<TreeNode>();
queue.add(root);
int index = 0;
while (!queue.isEmpty())
{
TreeNode t = queue.poll();
if (++index < nodeArr.length && !nodeArr[index].equals("#"))
{
t.left = new TreeNode(Integer.valueOf(nodeArr[index]));
queue.add(t.left);
}
if (++index < nodeArr.length && !nodeArr[index].equals("#"))
{
t.right = new TreeNode(Integer.valueOf(nodeArr[index]));
queue.add(t.right);
}
}
return root;
}
}
Last Update 2016.9.20