Hard 297题 Serialize and Deserialize Binary Tree

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 tree. There is no restriction on how your serialization/deserialization algorithm should work. You just need to ensure that a binary tree can be serialized to a string and this string can be deserialized to the original tree structure.

For example, you may serialize the following tree

    1
   / \
  2   3
     / \
    4   5
as  "[1,2,3,null,null,4,5]" , just the same as  how LeetCode OJ serializes a binary tree . You do not necessarily need to follow this format, so please be creative and come up with different approaches yourself.

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


Solution:


/**
 * 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 "";
        Queue q=new LinkedList();
        StringBuilder res = new StringBuilder();
        q.offer(root);
        while(!q.isEmpty())
        {
            TreeNode tmp=q.poll();
            if(tmp!=null)
                res=res.append(tmp.val).append(",");
            else
            {
                res=res.append("null,");
                continue;
            }
            q.offer(tmp.left);
            q.offer(tmp.right);
           
        }
        return res.toString().substring(0,res.length()-1);
    }

    // Decodes your encoded data to tree.
    public TreeNode deserialize(String data) {
        if (data == null||data.length()==0) 
            return null;
        String[] splitInfo = data.split(",");
        TreeNode res=new TreeNode(Integer.parseInt(splitInfo[0]));
        Queue q=new LinkedList();
        q.offer(res);
        for(int i=1;i<=splitInfo.length-1;i++)
        {
            TreeNode tmp_parent=q.poll();
            String tmp_1=splitInfo[i];
            if(!tmp_1.equals("null")){
                tmp_parent.left=new TreeNode(Integer.parseInt(splitInfo[i]));
                q.offer(tmp_parent.left);
            }
            String tmp_2=splitInfo[++i];
            if(!tmp_2.equals("null")){
                tmp_parent.right=new TreeNode(Integer.parseInt(splitInfo[i]));
                q.offer(tmp_parent.right);
            }
        }
        return res;
    }
}

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

DFS11/17

/**
 * 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) {
       StringBuilder sb=new StringBuilder();
       DFSserialize(root,sb);
       return sb.toString().substring(0, sb.toString().length()-1);
    }
    public void DFSserialize(TreeNode node,StringBuilder sb){
        if(node==null){
            sb.append("null,");
            return;
        }
        sb.append(node.val).append(",");
        DFSserialize(node.left, sb);
        DFSserialize(node.right,sb);
    }
    // Decodes your encoded data to tree.
    public TreeNode deserialize(String data) {
        if(data.length()==0||data==null)
            return null;
        String[] split=data.split(",");
        Queue q=new LinkedList();
        for(int i=0;i<=split.length-1;i++){
            q.offer(split[i]);
        }
        return DFSdeserialize(q);
        
    }
    
    public TreeNode DFSdeserialize(Queue q){
        String val = q.poll();
        if (val.equals("null")) 
            return null;
        else {
            TreeNode node=new TreeNode(Integer.parseInt(val));
            node.left=DFSdeserialize(q);
            node.right=DFSdeserialize(q);
            return node;
        }
    }
}
// Your Codec object will be instantiated and called as such:
// Codec codec = new Codec();
// codec.deserialize(codec.serialize(root));


你可能感兴趣的:(leetcode,hard)