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.
I currently only wrote a recursive way. I will update with a iterative way.
#include <string> #include <iostream> #include <sstream> using namespace std; struct TreeNode { int val; TreeNode* left; TreeNode* right; TreeNode(int value) : val(value), left(NULL), right(NULL) {} }; /* The tree is set up as 1 2 3 N N N N */ TreeNode* setUpTree() { TreeNode* root = new TreeNode(1); root->left = new TreeNode(2); root->right = new TreeNode(3); return root; } void serializeTree(TreeNode* root, string& output) { if(root == NULL) {output += "#"; return;} else { output += to_string(root->val); serializeTree(root->left, output); serializeTree(root->right, output); } } void deserialize_root(TreeNode*& root, istringstream& in) { char val; in >> val; if(val != '#') { root = new TreeNode(val - '0'); deserialize_root(root->left, in); deserialize_root(root->right, in); } } void deserialize(TreeNode*& root, string input) { int pos = 0; istringstream in(input); deserialize_root(root, in); } int main(void) { TreeNode* root = setUpTree(); string output = ""; serializeTree(root, output); cout << output << endl; TreeNode* newRoot = NULL; string newOutput = ""; deserialize(newRoot, output); serializeTree(newRoot, newOutput); cout << newOutput << endl; }