> For the complete documentation index, see [llms.txt](https://code.taozirui.com/lc/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://code.taozirui.com/lc/tree-traversal/serialize-and-deserialize-binary-tree.md).

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

For example, you may serialize the following tree

```
    1
   / \
  2   3
     / \
    4   5
```

as `"[1,2,3,null,null,4,5]"`, just the same as [how LeetCode OJ 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.

**Note:**&#x44;o not use class member/global/static variables to store states. Your serialize and deserialize algorithms should be stateless.

**Thoughts：**&#x20;

Serialization/Deserialization: Choose an order traversal and implement it.

```cpp
/**
 * 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 {

   // preorder implementaion 
public:

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

    void serialize(TreeNode * root, ostringstream & os){
        if(root){

            os<< root->val << ' '; // altervatively, os<< root->val << ",";
            serialize(root->left, os);
            serialize(root->right, os);
        }
        else{
            os << "# "; //stop token // altervatively, stringstream os << "#,";
        }
    }

    // Decodes your encoded data to tree.
    TreeNode* deserialize(string data) {
        istringstream in(data); 
        return deserialize(in);    
    }

    TreeNode* deserialize(istringstream& in){
        string val;
        in >> val;                    // if serialize data as "," separated, do: getline(in, val, ",");
        if(val == "#") return nullptr;

        TreeNode * root = new TreeNode(stoi(val));
        //preorder traversal
        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));
```

**Credits:**\
Special thanks to[@Louis1992](https://leetcode.com/discuss/user/Louis1992) for adding this problem and creating all test cases. Special thanks to [@StefanPochmann](https://discuss.leetcode.com/user/stefanpochmann) and [zhang lei](https://plus.google.com/109528017738097187607) in [水中的鱼](http://fisherlei.blogspot.com/search?q=Serialize+and+Deserialize+Binary+Tree) for adding the solution for this problem!
