zoukankan      html  css  js  c++  java
  • 【LeetCode】297. 二叉树的序列化与反序列化

    题目

    序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据。

    请设计一个算法来实现二叉树的序列化与反序列化。这里不限定你的序列 / 反序列化算法执行逻辑,你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构。

    示例:

    你可以将以下二叉树:
    
        1
       / 
      2   3
         / 
        4   5
    
    序列化为 "[1,2,3,null,null,4,5]"
    

    本题同【剑指Offer】面试题37. 序列化二叉树

    思路一:递归

    使用特殊符号(“#”)表示空树。

    代码

    class Codec {
    public:
    
        // Encodes a tree to a single string.
        string serialize(TreeNode* root) {        
            if (!root) return "#";
            return to_string(root->val) + " " + serialize(root->left) + " " + serialize(root->right);
    
        }
    
        // Decodes your encoded data to tree.
        TreeNode* deserialize(string data) {
            istringstream is(data);
            return dfs(is);
        }
    
        TreeNode* dfs(istringstream &is) {
            string s;
            is >> s;
            if (s == "#") return nullptr;
            TreeNode *node = new TreeNode(stoi(s));
            node->left = dfs(is);
            node->right = dfs(is);
            return node;
        }
    };
    

    另一种写法

    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 == nullptr) {
                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;
        }
    };
    
  • 相关阅读:
    0039. Combination Sum (M)
    imei和imsi
    APP网络测试要点和弱网模拟
    Git常用命令
    HTTP host头
    与apk签名有关的那些概念与命令
    你应该知道的运维术语
    nginx、fastCGI、php-fpm关系梳理
    adb连接手机报错解决方案汇总(win7)
    Android DVM
  • 原文地址:https://www.cnblogs.com/galaxy-hao/p/12445276.html
Copyright © 2011-2022 走看看