[LeetCode]Serialize and Deserialize BST

Question
Serialization is the process of converting a data structure or object into a sequence of bits so that it can be stored in a file or memory buffer, or transmitted across a network connection link to be reconstructed later in the same or another computer environment.

Design an algorithm to serialize and deserialize a binary search tree. There is no restriction on how your serialization/deserialization algorithm should work. You just need to ensure that a binary search tree can be serialized to a string and this string can be deserialized to the original tree structure.

The encoded string should be as compact as possible.

Note: Do not use class member/global/static variables to store states. Your serialize and deserialize algorithms should be stateless.


本题难度Medium。

DFS

【复杂度】
时间 O(N) 空间 O(N)

【思路】
采用先序遍历的方式序列化,再采用同样的先序遍历反序列化。

在此题目要求:
Note: Do not use class member/global/static variables to store states. Your serialize and deserialize algorithms should be stateless.
因此就不要幻想在Codec类中加入类似于int i;的字段通过修改i来达成对data读取进度的标记,解决办法就是使用Queue。

【注意】
1、不要幻想不用分隔符(我用的是“,”),没有分隔符对于1位以上的数是区分不了的。比如345,你觉得是1个数345还是分别3个数呢?(这就是我愚蠢的地方,耗费我数小时思考)

2、String的split方法有个坑:
对于"11,12,13,",用data.split(",")可以得到正确结果;但是",11,12,13"split后得到的是null。所以分隔符要放后面

【代码】

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
public class Codec {

    // Encodes a tree to a single string.
    public String serialize(TreeNode root) {
        //base case
        if(root==null)
            return "$,";
        //ensure
        return root.val+","+serialize(root.left)+serialize(root.right);
    }
    // Decodes your encoded data to tree.
    public TreeNode deserialize(String data) {
        //require
        Queue q=new LinkedList();
        //convert to string[] by " "
        String[] strs=data.split(",");
        for(String str:strs){
            q.add(str);
        }
        return dfs(q);
    }
    private TreeNode dfs(Queue q){
        String str=q.remove();
        //base case
        if(str.equals("$"))
            return null;

        TreeNode root=new TreeNode(Integer.valueOf(str));
        root.left=dfs(q);
        root.right=dfs(q);
        //ensure
        return root;
    }

}

// Your Codec object will be instantiated and called as such:
// Codec codec = new Codec();
// codec.deserialize(codec.serialize(root));

参考

[LeetCode]Serialize and Deserialize Binary Tree

你可能感兴趣的:(leetecode,experience)