# Leetcode 297. 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.

**Clarification:** The input/output format is the same as [how LeetCode serializes a binary tree](https://leetcode.com/faq/#binary-tree). You do not necessarily need to follow this format, so please be creative and come up with different approaches yourself.

**Example 1:**

![](https://1499094303-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MSfHJP6CFDvqlA01sOt%2F-MSfHg_VjvsrJ2j7Su0Q%2F-MSfIa23plf9DMI9C0RS%2Fimage.png?alt=media\&token=fa7dafd4-8bda-4c13-84d6-ce0bdd439d2d)

```
Input: root = [1,2,3,null,null,4,5]
Output: [1,2,3,null,null,4,5]
```

**Example 2:**

```
Input: root = []
Output: []
```

**Example 3:**

```
Input: root = [1]
Output: [1]
```

**Example 4:**

```
Input: root = [1,2]
Output: [1,2]
```

**Constraints:**

* The number of nodes in the tree is in the range `[0, 104]`.
* `-1000 <= Node.val <= 1000`

## **Solution:**&#x20;

[English Version in Youtube](https://youtu.be/iZHDx-k2Mxw)

[中文版解答Youtube Link](https://youtu.be/8_JSg4RWvhY)

[中文版解答Bilibili Link](https://www.bilibili.com/video/BV1rN411d7K1/)

### Solution 1:&#x20;

* Use to\_string to convert integer to a string.
* Use space to separate each node.
* Write a '#' for nullptr node.

```bash
class Codec {
    
    void readNext(stringstream& ss, int& val, bool &isnumber) {
        string str;
        ss >> str;
        if(str[0] == '#') {
            isnumber = false;
        } else {
            val = stoi(str);
            isnumber = true;
        }
        return;
    }
    
    TreeNode* help(stringstream& ss) {
        bool isnumber;
        int val;
        TreeNode *root = nullptr;
        readNext(ss, val, isnumber);
        
        if (isnumber) {
            root = new TreeNode(val);
            root->left = help(ss);
            root->right = help(ss);
        }
        return root;
    }
    
    // Encodes a tree to a single string.
    string _serialize(TreeNode* root) {
        if (root == nullptr) return "# ";
        else return to_string(root->val) + " " + _serialize(root->left) + _serialize(root->right);
    }
    
public:
    
    // Encodes a tree to a single string.
    string serialize(TreeNode* root) {
        string serialized_data = _serialize(root);
        return serialized_data;
    }
    
    // Decodes your encoded data to tree.
    TreeNode* deserialize(string data) {
        stringstream ss(data);
        return help(ss);
    }
};
```

### Solution 2:&#x20;

* Write 4 bytes for each integer.
* Write a 'Y' or 'N' for each node. No separator is need.

```bash
class Codec {
    
    void preorderDFS(TreeNode* root, string& serialized_data) {
        if (root == nullptr) {
            serialized_data.push_back('Y');
            return;
        }
        serialized_data.push_back('N');
        char buf[4];
        memcpy(buf, &(root->val), sizeof(int));
        for (int i = 0; i < 4; i++) serialized_data.push_back(buf[i]);
        preorderDFS(root->left, serialized_data);
        preorderDFS(root->right, serialized_data);
    }
    
    inline TreeNode* reconstruct(const string& buffer, int& pos) {
        if (pos >= buffer.size()) return nullptr;
        
        char indicator = buffer[pos];
        pos++;
        
        if (indicator == 'Y') {
            return nullptr;
        }
        
        int value;
        memcpy(&value, &buffer[pos], sizeof(int));
        
        TreeNode* node = new TreeNode(value);
        pos += sizeof(int);
        node->left = reconstruct(buffer, pos);
        node->right = reconstruct(buffer, pos);
        return node;
    }
    
public:
    
    // Encodes a tree to a single string.
    string serialize(TreeNode* root) {
        string serialized_data;
        preorderDFS(root, serialized_data);
        return serialized_data;
    }
    
    // Decodes your encoded data to tree.
    TreeNode* deserialize(string data) {
        int pos = 0;
        return reconstruct(data, pos);
    }
};
```
