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 5as
"[1,2,3,null,null,4,5]"
, just the same as how LeetCode OJ 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.
Credits:
Special thanks to @Louis1992 for adding this problem and creating all test cases.
- the format of serialized code looks as follows
- rootnode(serialized_root->left, serialized_root->right)
/** * 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 { public: // Encodes a tree to a single string. string serialize(TreeNode* root) { string ans; if(root == nullptr) return ""; ans.append(to_string(root->val)); ans.push_back('('); ans.append(serialize(root->left)); ans.push_back(','); ans.append(serialize(root->right)); ans.push_back(')'); return ans; } // Decodes your encoded data to tree. TreeNode* deserialize(string data) { return _deserialize(data); } TreeNode* _deserialize(string& data) { if(data.size() == 0 || data[0] == '(' || data[0] == ')' || data[0] == ',') return nullptr; TreeNode * root = new TreeNode(parseNum(data)); data.erase(0, 1); // erase '(' root->left = _deserialize(data); data.erase(0, 1); // erase ',' root->right = _deserialize(data); data.erase(0, 1); // erase ')' return root; } int parseNum(string & data){ int ans = 0; int flag = 1; int i = 0; if(data[0] == '-'){ flag = -1; i = 1; } while(data[i] <= '9' && data[i] >= '0'){ ans = ans * 10 + data[i] - '0'; i++; } ans = ans * flag; data.erase(0, i); return ans; } }; // Your Codec object will be instantiated and called as such: // Codec codec; // codec.deserialize(codec.serialize(root));