题目
序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据。
请设计一个算法来实现二叉树的序列化与反序列化。这里不限定你的序列 / 反序列化算法执行逻辑,你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构。
思路
使用递归实现二叉树前序遍历和反序列化。
代码
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Codec {
// Encodes a tree to a single string.
public String serialize(TreeNode root) {
String str="";
return serial(root,str);
}
public String serial(TreeNode root, String str){
if(root==null){
str+="None,";
}else{
str+=str.valueOf(root.val)+",";
str=serial(root.left,str);
str=serial(root.right,str);
}
return str;
}
// Decodes your encoded data to tree.
public TreeNode deserialize(String data) {
//将字符串转化为队列
String[] dataArray = data.split(",");
List<String> dataList = new LinkedList<String>(Arrays.asList(dataArray));
return deserial(dataList);
}
public TreeNode deserial(List<String> data){//利用队列恢复二叉树
if(data.get(0).equals("None")){
data.remove(0);
return null;
}
TreeNode root = new TreeNode(Integer.valueOf(data.remove(0)));
root.left=deserial(data);
root.right=deserial(data);
return root;
}
}
// Your Codec object will be instantiated and called as such:
// Codec codec = new Codec();
// codec.deserialize(codec.serialize(root));
复杂度分析
- 时间复杂度:O(n)
- 空间复杂度:O(n)