设计一个算法,并编写代码来序列化和反序列化二叉树。将树写入一个文件被称为“序列化”,读取文件后重建同样的二叉树被称为“反序列化”。如何反序列化或序列化二叉树是没有限制的,你只需要确保可以将二叉树序列化为一个字符串,并且可以将字符串反序列化为原来的树结构。
您在真实的面试中是否遇到过这个题?
Yes
样例
给出一个测试数据样例, 二叉树{3,9,20,#,#,15,7},表示如下的树结构:
3
/ \
9 20
/ \
15 7
我们的数据是进行BFS遍历得到的。当你测试结果wrong answer时,你可以作为输入调试你的代码。
你可以采用其他的方法进行序列化和反序列化。
标签 Expand
相关题目 Expand
解题思路
用先序遍历实现即可
/**
* 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 res = "";
public String serialize(TreeNode root) {
// write your code here
if(null==root) {
res = res + "# ";
}
else{
res += root.val+" ";
serialize(root.left);
serialize(root.right);
}
return res;
}
/**
* 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 int token = -1;
public TreeNode deserialize(String data) {
// write your code here
TreeNode root = null;
boolean flag = readNext(data);
if(flag){
root = new TreeNode(token);
root.left = deserialize(data);
root.right = deserialize(data);
}
return root;
}
/**
* 获取是否是数字是则返回true,并赋值给token,否则返回fasle
*/
public int cou = 0 ;
public boolean readNext(String data){
String tmp = "";
if(cou<data.length()-1){
char cur = data.charAt(cou);
while(cur!=' '){
tmp = tmp + cur;
cou++;
cur = data.charAt(cou);
}
cou++;
if("#".equals(tmp)){
return false;
}else{
token = Integer.parseInt(tmp);
return true;
}
}
return false;
}
}