题目
?
序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据。
请设计一个算法来实现二叉树的序列化与反序列化。这里不限定你的序列 / 反序列化算法执行逻辑,你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构。
示例 1:
输入:root = [1,2,3,null,null,4,5] (见下图)
输出:[1,2,3,null,null,4,5]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/serialize-and-deserialize-binary-tree
分析
这道题是困难级别,之所以是困难,不是因为它的算法复杂,而是如果你严格按照示例的格式来做,你完成它将变得很困难。
一开始我也没想到序列化顺序可以自己决定,不必像示例那样一层一层地来,如果你不幸地被示例误导了,那这确实是一道困难题。
跳开示例,解决这道题的思路就是怎么方便怎么来就是了,使用前序遍历是比较简单的解法。
代码
public class Codec {
// Encodes a tree to a single string.
public String serialize(TreeNode root) {
if(root == null){
return "X";
}
//前序遍历
return root.val + "," + serialize(root.left) + "," + serialize(root.right);
}
// Decodes your encoded data to tree.
public TreeNode deserialize(String data) {
if(data.equals("X")){
return null;
}
String[] datas = data.split(",");
TreeNode node = new TreeNode(Integer.parseInt(datas[0]));
recursive(node, 0, datas);
return node;
}
int recursive(TreeNode parent, int startIndex, String[] datas){
//超出数组范围退出
if(startIndex + 1 >= datas.length){
return startIndex;
}
//
if(!datas[startIndex + 1].equals("X")) {
TreeNode node = new TreeNode(Integer.parseInt(datas[startIndex + 1]));
parent.left = node;
startIndex = recursive(node,startIndex + 1 ,datas );
}else {
startIndex ++;
}
if(!datas[startIndex +1].equals("X")) {
TreeNode node = new TreeNode(Integer.parseInt(datas[startIndex + 1]));
parent.right = node;
startIndex = recursive(node,startIndex + 1 ,datas );
}else {
startIndex ++;
}
return startIndex;
}
}
结果
关注个人微信公众号:肌肉码农,回复“好友”讨论问题。
|