zoukankan      html  css  js  c++  java
  • [LeetCode] 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: 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.

    序列化和反序列化二叉树。

    使用输入和输出字符串流istringstream、ostringstream。

    序列化:从根结点开始,如果结点存在,将值存入输出字符串流。然后对其左右子节点递归调用序列化函数。

    反序列化:先读入第一个字符,以生成一个根结点。然后对根结点的左右子节点去序列化。

    /**
     * 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 << root->val << " ";
                serialize(root->left, out);
                serialize(root->right, out);
            }
            else
            {
                out << "# ";
            }
        }
        TreeNode* deserialize(istringstream& in)
        {
            string val;
            in >> val;
            if (val == "#")
                return NULL;
            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));

    利用queue进行迭代。

    /**
     * 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) {
            if (!root)
                return "";
            ostringstream out;
            queue<TreeNode*> q;
            q.push(root);
            while (!q.empty())
            {
                TreeNode* node = q.front();
                q.pop();
                if (node)
                {
                    out << node->val << " ";
                    q.push(node->left);
                    q.push(node->right);
                }
                else
                {
                    out << "# ";
                }
            }
            return out.str();
        }
    
        // Decodes your encoded data to tree.
        TreeNode* deserialize(string data) {
            if (data.empty())
                return NULL;
            istringstream in(data);
            queue<TreeNode*> q;
            string val;
            in >> val;
            TreeNode* root = new TreeNode(stoi(val));
            TreeNode* cur = root;
            q.push(cur);
            while (!q.empty())
            {
                TreeNode* node = q.front();
                q.pop();
                if (!(in >> val))
                    break;
                if (val != "#")
                {
                    cur = new TreeNode(stoi(val));
                    q.push(cur);
                    node->left = cur;
                }
                if (!(in >> val))
                    break;
                if (val != "#")
                {
                    cur = new TreeNode(stoi(val));
                    q.push(cur);
                    node->right = cur;
                }
            }
            return root;
        }
    };
    
    // Your Codec object will be instantiated and called as such:
    // Codec codec;
    // codec.deserialize(codec.serialize(root));
  • 相关阅读:
    Git 三种状态
    Git如何合并其它分支
    Git开发测试流程
    curl工具简介
    asp.net Forums 之HttpHandler和HttpModule
    WebRTC入门
    mac安装Homebrew
    iOS加载动态自定义字体
    My Frist in this frist!!
    javascript中直接取得DWR方法的返回值
  • 原文地址:https://www.cnblogs.com/immjc/p/9132444.html
Copyright © 2011-2022 走看看