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));
  • 相关阅读:
    atitit.nfc 身份证 银行卡 芯片卡 解决方案 attilax总结
    atitit.php 流行框架 前三甲为:Laravel、Phalcon、Symfony2 attilax 总结
    Atitit.执行cmd 命令行 php
    Atitit. 图像处理jpg图片的压缩 清理垃圾图片 java版本
    atitit。企业组织与软件工程的策略 战略 趋势 原则 attilax 大总结
    atitit. 管理哲学 大毁灭 如何防止企业的自我毁灭
    Atitit.java的浏览器插件技术 Applet japplet attilax总结
    Atitit.jquery 版本新特性attilax总结
    Atitit. 软件开发中的管理哲学一个伟大的事业必然是过程导向为主 过程导向 vs 结果导向
    (转)获取手机的IMEI号
  • 原文地址:https://www.cnblogs.com/immjc/p/9132444.html
Copyright © 2011-2022 走看看