• Serialize and Deserialize Binary Tree


    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.

    Example: 

    You may serialize the following tree:
    
        1
       / 
      2   3
         / 
        4   5
    
    as "[1,2,3,null,null,4,5]"
    

    Clarification: The above format is the same as how LeetCode 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.



     

    Approach #1: C++.

    /**
     * Definition for a binary tree node.
     * struct TreeNode {
     *     int val;
     *     TreeNode *left;
     *     TreeNode *right;
     *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     * };
     */
    class Codec {
    public:
    
        // Encodes a tree to a single string.
        string serialize(TreeNode* root) {
            ostringstream out;
            serialize(root, out);
            return out.str();
        }
    
        // Decodes your encoded data to tree.
        TreeNode* deserialize(string data) {
            istringstream in(data);
            return deserialize(in);
        }
        
    private:
        void serialize(TreeNode* root, ostringstream& out) {
            if (!root) {
                out << "# ";
                return ;
            }
            out << root->val << " ";
            serialize(root->left, out);
            serialize(root->right, out);
        }
        
        TreeNode* deserialize(istringstream& in) {
            string val;
            in >> val;
            if (val == "#") return nullptr;
            TreeNode* root = new TreeNode(stoi(val));
            root->left = deserialize(in);
            root->right = deserialize(in);
            return root;
        }
    };
    
    // Your Codec object will be instantiated and called as such:
    // Codec codec;
    // codec.deserialize(codec.serialize(root));  

    Approach #2: Java.

    /**
     * Definition for a binary tree node.
     * public class TreeNode {
     *     int val;
     *     TreeNode left;
     *     TreeNode right;
     *     TreeNode(int x) { val = x; }
     * }
     */
    public class Codec {
        private static final String spliter = ",";
        private static final String NN = "X";
    
        // Encodes a tree to a single string.
        public String serialize(TreeNode root) {
            StringBuilder sb = new StringBuilder();
            buildString(root, sb);
            return sb.toString();
        }
        
        private void buildString(TreeNode node, StringBuilder sb) {
            if (node == null) sb.append(NN).append(spliter);
            else {
                sb.append(node.val).append(spliter);
                buildString(node.left, sb);
                buildString(node.right, sb);
            }
        }
    
        // Decodes your encoded data to tree.
        public TreeNode deserialize(String data) {
            Deque<String> nodes = new LinkedList<>();
            nodes.addAll(Arrays.asList(data.split(spliter)));
            return buildTree(nodes);
        }
        
        private TreeNode buildTree(Deque<String> nodes) {
            String val = nodes.remove();
            if (val.equals(NN)) return null;
            else {
                TreeNode node = new TreeNode(Integer.valueOf(val));
                node.left = buildTree(nodes);
                node.right = buildTree(nodes);
                return node;
            }
        }
    }
    
    // Your Codec object will be instantiated and called as such:
    // Codec codec = new Codec();
    // codec.deserialize(codec.serialize(root));
    

      

    Analysis: 

    c++ --------> std::istringstream::str

    string str() const;
    void str (const string& s);
    Get/set content

    The first form (1) returns a string object with a copy of the current contents of the stream.

    The second form (2) sets str as the contents of the stream, discarding any previous contents. The object preserves its open mode: if this includes ios_base::ate, the writing position is moved to the end of the new sequence.

    Internally, the function calls the str member of its internal string buffer object.

    example:

    // istringstream::str
    #include <string>       // std::string
    #include <iostream>     // std::cout
    #include <sstream>      // std::istringstream
    
    int main () {
      std::istringstream iss;
      std::string strvalues = "32 240 2 1450";
    
      iss.str (strvalues);
    
      for (int n=0; n<4; n++)
      {
        int val;
        iss >> val;
        std::cout << val << '
    ';
      }
      std::cout << "Finished writing the numbers in: ";
      std::cout << iss.str() << '
    ';
      return 0;
    }
    

      

    output:

    32
    240
    2
    1450
    Finished writing the numbers in: 32 240 2 1450
    

      

    java---------->BuildString.

    永远渴望,大智若愚(stay hungry, stay foolish)
  • 相关阅读:
    一个完成的spring xml配置文件
    一个简单的Spring程序
    Spring beans.xml
    strust2的核心和工作原理
    MVC模式
    JSON 之FastJson解析
    Java本地方法(native方法)的实现
    RMI(Remote Method Invocation ) 概念恢复
    java注解
    输入sql语句,将结果写入到xml文件
  • 原文地址:https://www.cnblogs.com/h-hkai/p/10009665.html
Copyright © 2020-2023  润新知