449. Serialize and Deserialize BST

来源:互联网 发布:郑州大学软件学院2017 编辑:程序博客网 时间:2024/06/09 14:24

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.

这里先用stack进行preorder遍历,用“,”分隔node.val组成string,这是encode。对于decode,先分隔出所有的substring,用queue存下node.val,根据BST的性质,可以知道第一个数是root,向后遍历后面所有比他小的数在左子树,之后的数在右子树,递归构造整个数。代码如下:

/** * 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) {        if (root == null) {            return "null";        }        StringBuilder builder = new StringBuilder();        Stack<TreeNode> stack = new Stack<TreeNode>();        stack.push(root);        while (!stack.isEmpty()) {            root = stack.pop();            builder.append(root.val).append(',');            if (root.right != null) stack.push(root.right);            if (root.left != null) stack.push(root.left);        }        System.out.print(stack);        return builder.toString();    }    // Decodes your encoded data to tree.    public TreeNode deserialize(String data) {        if (data.equals("null")) {            return null;        }        Queue<Integer> queue = new LinkedList<Integer>();        String[] strs= data.split(",");        for (String str: strs) {            queue.offer(Integer.parseInt(str));        }        return getNode(queue);    }        private TreeNode getNode(Queue<Integer> queue) {        if (queue.isEmpty()) {            return null;        }        TreeNode root = new TreeNode(queue.poll());        Queue<Integer> smallerNodes = new LinkedList<Integer>();        while (!queue.isEmpty() && queue.peek() < root.val) {            smallerNodes.offer(queue.poll());        }        root.left = getNode(smallerNodes);        root.right = getNode(queue);        return root;    }}// Your Codec object will be instantiated and called as such:// Codec codec = new Codec();// codec.deserialize(codec.serialize(root));

原创粉丝点击