序列化是将数据结构或对象转换为一系列位的过程,以便它可以存储在文件或内存缓冲区中,或通过网络连接链路传输,以便稍后在同一个或另一个计算机环境中重建。
设计一个算法来序列化和反序列化 二叉搜索树 。 对序列化/反序列化算法的工作方式没有限制。 您只需确保二叉搜索树可以序列化为字符串,并且可以将该字符串反序列化为最初的二叉搜索树。
编码的字符串应尽可能紧凑。
示例 1:
输入:root = [2,1,3]
输出:[2,1,3]
示例 2:
输入:root = []
输出:[]
提示:
树中节点数范围是 [0, 104]
0 <= Node.val <= 104
题目数据 保证 输入的树是一棵二叉搜索树。
注意:不要使用类成员/全局/静态变量来存储状态。 你的序列化和反序列化算法应该是无状态的。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/serialize-and-deserialize-bst
该题目的详细解析可以看这里:
https://leetcode-solution-leetcode-pp.gitbook.io/leetcode-solution/selected/serialize
思路:
1. 将二叉树转为字符串
a. 可以选择前序遍历,且要把叶子节点的左右 null 节点添加到生成的字符串中,不同的节点之间用 逗号分隔
b. 思考为啥要把叶子节点的左右 null 节点 加入到字符串?
个人觉得是为了在反序列化的时候,能够方便一些的确认是否到达叶子节点
2. 将字符串反过来转为 二叉树
a. 按照前序遍历的顺序遍历生成的字符串,并把每次添加到生成二叉树的节点 从字符串中remove 掉。
b. 递归终止条件就是到达叶子节点的左右 null 节点
Java代码如下:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
import java.lang.*;
public class Codec {
// Encodes a tree to a single string.
public String serialize(TreeNode root) {
return serializeStr(root,"");
}
public String serializeStr(TreeNode root, String str) {
if (root == null) {
return str + "null,";
}
str = str + root.val+",";
str = serializeStr(root.left,str);
str = serializeStr(root.right,str);
return str;
}
// Decodes your encoded data to tree.
public TreeNode deserialize(String data) {
System.out.println(data);
String[] strs = data.split(",");
List list = new LinkedList();
for (String s:strs) {
list.add(s);
}
return deserializeStr(list);
}
public TreeNode deserializeStr(List nodes) {
if (nodes.get(0).equals("null")) { //当前null节点的父亲节点为二叉树的叶子节点
nodes.remove(0);
return null;
}
TreeNode root = new TreeNode(Integer.parseInt(nodes.get(0)));
nodes.remove(0);
root.left = deserializeStr(nodes);
root.right = deserializeStr(nodes);
return root;
}
}
// Your Codec object will be instantiated and called as such:
// Codec ser = new Codec();
// Codec deser = new Codec();
// String tree = ser.serialize(root);
// TreeNode ans = deser.deserialize(tree);
// return ans;