標籤:
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. 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;}
LeetCode 297. Serialize and Deserialize Binary Tree