【算法训练】LeetCode#297 二叉树的序列化与反序列化
一、描述
297. 二叉树的序列化与反序列化
序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据。
请设计一个算法来实现二叉树的序列化与反序列化。这里不限定你的序列 / 反序列化算法执行逻辑,你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构。
示例 1:
输入:root = [1,2,3,null,null,4,5]
输出:[1,2,3,null,null,4,5]
示例 2:
输入:root = []
输出:[]
示例 3:
输入:root = [1]
输出:[1]
示例 4:
输入:root = [1,2]
输出:[1,2]
二、思路
序列化的本意是能够存储指定对象并在需要时逆序列化还原回来,因此这道题无所谓是先序还是层序或者其他的序列化方法,只要是能将序列化后的字符串还原回原树即可。
这里采用先序序列化和逆序列化。
三、解题
public class LeetCode297 {
public static class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) { val = x; }
}
public static class Codec {
StringBuilder res = new StringBuilder();
Deque<TreeNode> queue = new LinkedList<>();
// 序列化
public String serialize(TreeNode root) {
preSer(root);
res.deleteCharAt(res.length()-1);
return res.toString();
}
// 先序遍历 序列化
public void preSer(TreeNode node){
if (node == null){
res.append("null,");
} else {
res.append(String.valueOf(node.val)).append(",");
preSer(node.left);
preSer(node.right);
}
}
// 反序列化
public TreeNode deserialize(String data) {
String[] vals = data.split(",");
Queue<TreeNode> nodes = new LinkedList<>();
for (String val : vals){
nodes.add( "null".equals(val) ? null : new TreeNode(Integer.parseInt(val)));
}
System.out.println(nodes);
return preDes(nodes);
}
public TreeNode preDes(Queue<TreeNode> nodes){
TreeNode node = nodes.poll();
if (node == null){
return null;
}
node.left = preDes(nodes);
node.right = preDes(nodes);
return node;
}
}
public static void main(String[] args) {
Codec a = new Codec();
TreeNode root = new TreeNode(1);
root.left = new TreeNode(2);
root.right = new TreeNode(3);
root.right.left = new TreeNode(4);
root.right.left.right = new TreeNode(5);
String str = a.serialize(root);
System.out.println(str);
TreeNode node = a.deserialize(str);
System.out.println(node);
}
}