449-Serialize and Deserialize BST

kevin聰發表於2018-05-06

Description

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.


問題描述

對二叉排序樹進行序列化和反序列化

注意, 不要使用成員變數, 全域性變數, 靜態變數來儲存狀態。


問題分析

使用前序遍歷進行序列化
在反序列化的過程中, 注意上界和下界


解法1

public class Codec {
    private static final String spliter = ",";

    // Encodes a tree to a single string.
    public String serialize(TreeNode root){
        if(root == null)    return null;

        StringBuilder sb = new StringBuilder();
        preorder(root, sb);

        return sb.toString();
    }

    private void preorder(TreeNode root, StringBuilder sb){
        if(root == null)    return;

        sb.append(root.val).append(spliter);
        preorder(root.left, sb);
        preorder(root.right, sb);
    }

    // Decodes your encoded data to tree.
    public TreeNode deserialize(String data){
        if(data == null || data.length() == 0)  return null;

        String[] sa = data.split(spliter);
        int[] index = new int[]{0};
        return helper(sa, index, Long.MIN_VALUE, Long.MAX_VALUE);
    }

    // construct BST from preorder order traversal;
    private TreeNode helper(String[] sa, int[] index, long min, long max){
        if(index[0] >= sa.length)   return null;

        TreeNode root = null;
        int rootValue = Integer.parseInt(sa[index[0]]);
        if(rootValue > min && rootValue < max){
            root = new TreeNode(rootValue);
            index[0]++;
            root.left = helper(sa, index, min, rootValue);
            root.right = helper(sa, index, rootValue, max);
        }

        return root;
    }
}

解法2

public class Codec {
    // Encodes a tree to a single string.
    public String serialize(TreeNode root) {
        StringBuilder sb = new StringBuilder();
        serializeHelper(sb, root);

        return sb.toString();
    }

    private void serializeHelper(StringBuilder sb, TreeNode root) {
        if(root == null)    return;

        sb.append((char)root.val);
        serializeHelper(sb, root.left);
        serializeHelper(sb, root.right);
    }

    // Decodes your encoded data to tree.
    public TreeNode deserialize(String data) {
        Queue<Character> queue = new LinkedList();
        for(Character ch: data.toCharArray())   queue.offer(ch);

        return deserializeHelper(queue, Integer.MIN_VALUE, Integer.MAX_VALUE);
    }

    private TreeNode deserializeHelper(Queue<Character> queue, int min, int max) {
        if(queue.isEmpty() || Integer.valueOf(queue.peek()) >= max) return null;

        int val = Integer.valueOf(queue.poll());
        TreeNode root = new TreeNode(val);
        root.left = deserializeHelper(queue, min, val);
        root.right = deserializeHelper(queue, val, max);

        return root;
    }
}

相關文章