1,题目要求
请实现两个函数,分别用来序列化和反序列化二叉树。
2,题目思路
对于这道题,要求将一颗二叉树序列化并反序列化。
所谓序列化 (Serialization),是将对象的状态信息转换为可以存储或传输的形式的过程。
在这道题中,序列化是将一棵树转化为一个字符串,而反序列化是将字符串转化为一颗二叉树。
对于序列化:
我们使用前序遍历的方法,递归地将这颗二叉树中的所有节点的值转化为字符,两两之间用’,‘分割,对于空节点,利用’#'来表示。
对于反序列化:
按照前序顺序,递归的使用字符串中的字符创建一个二叉树。
LeetCode类似题目:
Serialize and Deserialize Binary Tree
3,代码实现
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};
*/
class Solution {
public:
char* Serialize(TreeNode *root) {
if(!root)
return nullptr;
string str = "";
serializeHelper(root, str);
char *res = new char[str.size()+1];
for(int i = 0;i<str.size();i++)
res[i] = str[i];
res[str.size()] = '\0';
return res;
}
TreeNode* Deserialize(char *str) {
if(!str)
return nullptr;
TreeNode *res = deserializeHelper(&str);
return res;
}
private:
void serializeHelper(TreeNode* root, string& str){
if(!root){
str += '#';
return;
}
string val = to_string(root->val);
str += val + ',';
serializeHelper(root->left, str);
serializeHelper(root->right,str);
}
TreeNode* deserializeHelper(char **str){
if(**str == '#'){
(*str)++;
return nullptr;
}
int val = 0;
while(**str!='\0'&&**str!=','){
val = val*10 + ((**str) - '0');
(*str)++;
}
TreeNode* root = new TreeNode(val);
if(**str == '\0')
return root;
else
(*str)++;
root->left = deserializeHelper(str);
root->right= deserializeHelper(str);
return root;
}
};