---
# System prepended metadata

title: 'LeetCode #297 [Serialize and Deserialize Binary Tree](https://leetcode.com/problems/serialize-and-deserialize-binary-tree/)'
tags: [Recursion, LeetCode, Hard, Tree, Queue]

---

###### tags: `LeetCode` `Tree` `Recursion` `Queue` `Hard`
# LeetCode #297 [Serialize and Deserialize Binary Tree](https://leetcode.com/problems/serialize-and-deserialize-binary-tree/)
### (Hard)
序列化是將一個數據結構或者對象轉換為連續的bits的操作，進而可以將轉換後的數據存儲在一個文件或者內存中，同時也可以通過網絡傳輸到另一個電腦環境，採取相反方式重構得到原數據。

請設計一個算法來實現二元樹的序列化與反序列化。這裡不限定你的序列/反序列化算法執行邏輯，你只需要保證一個二元樹可以被序列化為一個字符串並且將這個字符串反序列化為原始的樹結構。


---
核心概念很簡單, 將樹用preorder形式轉換成字串, 再轉換回來即可, 只要前後轉換使用的遍歷方式一樣即可(preorder)。


---
```
class Codec {
public:
    int i=2000;
    // Encodes a tree to a single string.
    string serialize(TreeNode* root) {
        string s;
        serialize(root, s);
        return s;
    }
    void serialize(TreeNode* node, string& s){
        if(!node){
            s.append(reinterpret_cast<const char*>(&i), sizeof(i));
            return;
        }
        s.append(reinterpret_cast<const char*>(&node->val), sizeof(node->val));
        serialize(node->left, s);
        serialize(node->right, s);
    }

    // Decodes your encoded data to tree.
    TreeNode* deserialize(string data) {
        int pos=0;
        return deserialize(data, pos);
    }
    TreeNode* deserialize(const string& s, int& pos){
        if (pos>=s.size()) return nullptr;
        int val=*reinterpret_cast<const int*>(s.data()+pos);
        if(val==2000){
            pos+=sizeof(val); //這邊要注意, 即使回傳nullptr, pos的位置仍然要往後挪
            return nullptr;
        }
        pos+=sizeof(val);
        TreeNode* node=new TreeNode(val);
        node->left=deserialize(s, pos);
        node->right=deserialize(s, pos);
        return node;
    }
};
```