LeetCode~449. 序列化和反序列化二叉搜索树

149 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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;
    }
}