Serialize and Deserialize Binary Tree

1,题目要求

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.

Serialize and Deserialize Binary Tree

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.

序列化是将数据结构或对象转换为比特序列的过程,以便它可以存储在文件或存储缓冲器中,或者通过网络连接链路传输,以便稍后在相同或另一个计算机环境中重建。

设计一种算法来序列化和反序列化二叉树。 序列化/反序列化算法的工作方式没有限制。 您只需要确保二进制树可以序列化为字符串,并且可以将此字符串反序列化为原始树结构。

澄清:以上格式与LeetCode序列化二叉树的方式相同。 您不一定需要遵循这种格式,因此请发挥创意并自己提出不同的方法。

注意:不要使用类成员/全局/静态变量来存储状态。 您的序列化和反序列化算法应该是无状态的。

2,题目思路

对于这道题,要求将一颗二叉树序列化和反序列化。

所谓序列化 (Serialization),是将对象的状态信息转换为可以存储或传输的形式的过程。

在这道题中,序列化是将一棵树转化为一个字符串,而反序列化是将字符串转化为一颗二叉树。

在实现序列化时,我们使用istringstream和ostringstream来实现串流风格的输入和输出。

  • istringstream类用于执行串流的输入操作。
  • ostringstream类用于执行串流的输出操作。

其中,空格作为字符串分隔符。

3,代码实现

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */

static const auto s = []() {
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    return nullptr;
}();

class Codec {
public:

    // Encodes a tree to a single string.
    string serialize(TreeNode* root) {
        ostringstream out;
        serializeHelper(root, out);
        return out.str();
        
    }

    // Decodes your encoded data to tree.
    TreeNode* deserialize(string data) {
        istringstream in(data);
        return deserializeHelper(in);
    }
private:
    void serializeHelper(TreeNode* root, ostringstream& out){
        if(root){
            out << root->val << ' ';
            serializeHelper(root->left, out);
            serializeHelper(root->right,out);
        }
        else{
            out << "# ";
        }
    }
    
    TreeNode* deserializeHelper(istringstream& in){
        string val;
        in >> val;
        if(val == "#")
            return nullptr;
        TreeNode* root = new TreeNode(stoi(val));
        root->left = deserializeHelper(in);
        root->right= deserializeHelper(in);
        return root;
    }
};

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