297.二叉树的序列化与反序列化
- 二叉树的序列化与反序列化
难度困难176
序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据。
请设计一个算法来实现二叉树的序列化与反序列化。这里不限定你的序列 /
反序列化算法执行逻辑,你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构。示例:
你可以将以下二叉树: 1 / 2 3 / 4 5 序列化为 "[1,2,3,null,null,4,5]"
提示: 这与 LeetCode 目前使用的方式一致,详情请参阅 LeetCode
序列化二叉树的格式。你并非必须采取这种方式,你也可以采用其他的方法解决这个问题。说明: 不要使用类的成员 / 全局 / 静态变量来存储状态,你的序列化和反序列化算法应该是无状态的。
/*
* 思路:
1、序列化 创建一个builder 用 , 进行分隔 如果是null 则用 x 进行标记。
Tree -> 字符串
2、反序列化 使用双端队列进行添加搜索元素,x 说明是一个Null 跳过,否则的话 就直接 递归
查找递归root.left 和 root.right
*/
//构建字符串
private static final String spliter = ",";
private static final String NN = "x";
// Encodes a tree to a single string.
// 构建二叉树序列化-》BST>String
public String serialize(TreeNode root) {
StringBuilder sb = new StringBuilder();
buildString(root,sb);
return sb.toString();
}
private void buildString(TreeNode root,StringBuilder sb){
//root == null
if(root == null){ // x,
sb.append(NN).append(spliter);
}else{
sb.append(root.val).append(spliter);
buildString(root.left,sb);
buildString(root.right,sb);
}
}
// Decodes your encoded data to tree.
public TreeNode deserialize(String data) {
Deque<String> nodes = new LinkedList<>();
nodes.addAll(Arrays.asList(data.split(spliter)));
return buildTree(nodes);
}
public TreeNode buildTree(Deque<String> nodes){
String val = nodes.remove();
if(val.equals(NN)) return null;
else{
TreeNode node = new TreeNode(Integer.valueOf(val));
node.left = buildTree(nodes);
node.right = buildTree(nodes);
return node;
}
}