持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第9天,点击查看活动详情
题目描述
序列化是将数据结构或对象转换为一系列位的过程,以便它可以存储在文件或内存缓冲区中,或通过网络连接链路传输,以便稍后在同一个或另一个计算机环境中重建。
设计一个算法来序列化和反序列化 二叉搜索树 。 对序列化/反序列化算法的工作方式没有限制。 您只需确保二叉搜索树可以序列化为字符串,并且可以将该字符串反序列化为最初的二叉搜索树。
编码的字符串应尽可能紧凑。
示例
输入: root = [2,1,3]
输出: [2,1,3]
输入: root = []
输出: []
提示
- 树中节点数范围是
[0, 10^4] 0 <= Node.val <= 10^4- 题目数据 保证 输入的树是一棵二叉搜索树。
先序遍历
二叉树序列化与反序列化,可以通过遍历的方式,得到其每个节点的值,使用分隔符拼接成字符串返回(空节点需要预留)。反序列化时将结果按照分隔符区分开,再划分好区间,重新构建成树节点(遇到空节点则返回)。
public class Codec {
// 序列化
public String serialize(TreeNode root) {
List<Integer> ans = new ArrayList<>();
preOrder(root, ans);
String s = ans.toString();
return s.substring(1, s.length() - 1);
}
// 前序遍历
private void preOrder(TreeNode node, List<Integer> ans) {
if(node != null) {
ans.add(node.val);
preOrder(node.left, ans);
preOrder(node.right, ans);
}
}
// 反序列化
public TreeNode deserialize(String data) {
if(data == "") {
return null;
}
String[] vals = data.split(", ");
return dfs(-1, data.length(), new int[]{0}, vals);
}
// 构建树节点
private TreeNode dfs(int left, int right, int[] idx, String[] vals) {
if(idx[0] == vals.length)
return null;
int val = Integer.parseInt(vals[idx[0]]);
if(val < left || val > right)
return null;
idx[0]++;
TreeNode node = new TreeNode(val);
node.left = dfs(left, val, idx, vals);
node.right = dfs(val, right, idx, vals);
return node;
}
}