Leetcode 449 Serialize and Deserialize BST

来源:互联网 发布:淘宝v3会员是几钻 编辑:程序博客网 时间:2024/06/05 07:51

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.


考虑一种二叉树的遍历,比如preorder

那么string应该是 root left right 如果是null 就直接写null


值得注意的是如何恢复 这也是要选先序遍历的原因

前面一个是root 那么后面的比root小的全部是左子树的节点

然后后边比root大的全都是右子树的节点


/** * Definition for a binary tree node. * public class TreeNode { *     int val; *     TreeNode left; *     TreeNode right; *     TreeNode(int x) { val = x; } * } */public class Codec {    Stack<TreeNode> s = new Stack<>();    // Encodes a tree to a single string.    public String serialize(TreeNode root) {        if(root == null){            return "null";        }        StringBuffer sb = new StringBuffer();        s.push(root);        while(!s.isEmpty()){            TreeNode tmp = s.pop();            sb.append(String.valueOf(tmp.val));            sb.append(",");            if(tmp.right != null){                s.push(tmp.right);            }            if(tmp.left != null){                s.push(tmp.left);            }        }        return sb.toString();    }    // Decodes your encoded data to tree.    public TreeNode deserialize(String data) {        if(data.equals("null")) return null;        String[] str = data.split(",");        Queue<Integer> q = new LinkedList<>();        for(String s : str){            q.offer(Integer.parseInt(s));        }        return build(q);    }         private TreeNode build(Queue<Integer> q) {         if (q.isEmpty()) return null;        TreeNode root = new TreeNode(q.poll());        Queue<Integer> leftnodes = new LinkedList<>();        while (!q.isEmpty() && q.peek() < root.val) {            leftnodes.offer(q.poll());        }                root.left = build(leftnodes);                root.right = build(q);         return root;    }}// Your Codec object will be instantiated and called as such:// Codec codec = new Codec();// codec.deserialize(codec.serialize(root));


原创粉丝点击