题目
描述
设计一个算法,并编写代码来序列化和反序列化二叉树。将树写入一个文件被称为“序列化”,读取文件后重建同样的二叉树被称为“反序列化”。
如何反序列化或序列化二叉树是没有限制的,你只需要确保可以将二叉树序列化为一个字符串,并且可以将字符串反序列化为原来的树结构。
样例
给出一个测试数据样例, 二叉树{3,9,20,#,#,15,7}
,表示如下的树结构:
3
/ \
9 20
/ \
15 7
我们的数据是进行BFS遍历得到的。当你测试结果wrong answer时,你可以作为输入调试你的代码。
你可以采用其他的方法进行序列化和反序列化。
解答
思路
基础题。
开始忘了Queue类。手动写字符串数组“弹出”的功能,很麻烦。查到Queue类就能很好的解决这个问题了。
代码
/**
* 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) {
// write your code here
// 若根节点为空,返回“#,”
if(root == null)
return "#,";
// 新建StringBudffer,存储节点值
StringBuffer sb = new StringBuffer(root.val+",");
// 递归左子树
sb.append(serialize(root.left));
// 递归右子树
sb.append(serialize(root.right));
// 返回StringBuffer的字符串值
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) {
// write your code here
// 将在字符串按照','拆开成字符串数组
String[] ss = data.split(",");
// 用字符串数组构建字符串队列
Queue<String> q = new LinkedList<String>();
for(int i = 0; i < ss.length; i++){
q.add(ss[i]);
}
// 递归生成二叉树
return preOrder(q);
}
private TreeNode preOrder(Queue<String> q){
// “弹出”队列下一个字符串
String val = q.poll();
// 如果值为'#'说明是空结点
if(val.equals("#")) return null;
// 如果值不为'#',用该值的整型值构建节点
TreeNode node = new TreeNode(Integer.valueOf(val));
// 遍历构建节点左子树
node.left = preOrder(q);
// 遍历构建节点右子树
node.right = preOrder(q);
// 返回节点
return node;
}
}