449. Serialize and Deserialize BST

Problem:
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.

Analysis:
This problem needs to encode as compact as possible so that "null" should be avoided. We use recursive preorder. While desalinizing, use lower bound and uppder bound to decide the legitimacy of current value. Converting data to queue, to reduce remove complexity to constant. 
Similar problem
98. Validate Binary Search Tree
When dealing with BST, always remember to use lower bound and upper bound. 
Solution:
public class Codec {
    // Encodes a tree to a single string.
    public String serialize(TreeNode root) {
        if (root == null)
            return "";
        StringBuilder sb = new StringBuilder();
        serialize(root, sb);
        sb.setLength(sb.length() - 1);
        return sb.toString();
    }

    private void serialize(TreeNode root, StringBuilder sb) {
        if (root == null)    return;
        sb.append(root.val).append(",");
        serialize(root.left, sb);
        serialize(root.right, sb);
    }

    // Decodes your encoded data to tree.
    public TreeNode deserialize(String data) {
        if (data == null || data.length() == 0) return  null;
        String[] strs = data.split(",");        
        Queue<Integer> queue = new LinkedList<>();
        for (String str: strs) {
            queue.offer(Integer.valueOf(str));
        }  
        return deserialize(queue, Integer.MIN_VALUE, Integer.MAX_VALUE); 
    }

    private TreeNode deserialize(Queue<Integer> queue, int lower, int upper) {
        if (queue.isEmpty())
            return null;
        int val = queue.peek();
        if (val < lower || val > upper)
            return null;
        queue.poll();
        TreeNode root = new TreeNode(val);
        root.left = deserialize(queue, lower, val);
        root.right = deserialize(queue, val, upper);
        return root;
    }
}

评论

此博客中的热门博文

776. Split BST

663. Equal Tree Partition

532. K-diff Pairs in an Array