LeetCode 刷题系列 449. 序列化和反序列化二叉搜索树

序列化是将数据结构或对象转换为一系列位的过程,以便它可以存储在文件或内存缓冲区中,或通过网络连接链路传输,以便稍后在同一个或另一个计算机环境中重建。

设计一个算法来序列化和反序列化 二叉搜索树 。 对序列化/反序列化算法的工作方式没有限制。 您只需确保二叉搜索树可以序列化为字符串,并且可以将该字符串反序列化为最初的二叉搜索树。

编码的字符串应尽可能紧凑。

示例 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;

 

你可能感兴趣的:(LeetCode)