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 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.
解题思路:
序列化时用层先遍历法,遇到null则往字符串后面加#,否则加上相应的数字并入队。
解序列化时也用层先遍历
C++代码如下:
string intTostring(int t) {
stringstream ss;
string s;
ss << t;
ss >> s;
return s;
}
int stringToint(string s) {
if (s == "")return 0;
int t;
stringstream ss;
ss << s;
ss >> t;
return t;
}
// Encodes a tree to a single string.
string serialize(TreeNode* root) {
if (root == NULL)return "";
queue<TreeNode*> que;
string s = intTostring(root->val);
que.push(root);
while (!que.empty()) {
TreeNode* tmp = que.front();
que.pop();
if (tmp->left != NULL) {
s += "," + intTostring(tmp->left->val);
que.push(tmp->left);
}
else {
s += ",#";
}
if (tmp->right != NULL) {
s += "," + intTostring(tmp->right->val);
que.push(tmp->right);
}
else {
s += ",#";
}
}
return s;
}
// Decodes your encoded data to tree.
TreeNode* deserialize(string data) {
if ("" == data)return NULL;
TreeNode* root;
int t;
t = data.find(',');
if (t == -1) {
root = new TreeNode(stringToint(data));
return root;
}
else {
root=new TreeNode(stringToint(data.substr(0,t)));
}
data = data.substr(t + 1);
queue<TreeNode*> que;
que.push(root);
while (!que.empty()&&data!="") {
TreeNode* tmpnode = que.front();
que.pop();
TreeNode* children[2];
for (int i = 0; i < 2; i++) {
t = data.find(',');
if (t == -1) {
if ("#" == data) {
children[i] = NULL;
}
else {
children[i] = new TreeNode(stringToint(data));
}
data = "";
continue;
}
string val = data.substr(0,t);
if ("#" == val) {
children[i] = NULL;
}
else {
children[i] = new TreeNode(stringToint(val));
}
data = data.substr(t + 1);
}
tmpnode->left = children[0];
if(tmpnode->left)que.push(tmpnode->left);
tmpnode->right = children[1];
if(tmpnode->right)que.push(tmpnode->right);
}
return root;
}