1.题目描述
请实现两个函数,分别用来序列化和反序列化二叉树。
两个函数分别是:
char* Serialize(TreeNode *root) {
}
TreeNode* Deserialize(char *str) {
}
2.问题分析
系列化和反系列化都应该是一样的遍历方式,或者前序遍历或者中序遍历或者后序遍历。但是为了方便,我们使用前序遍历,第一个字符就是根节点。
序列化的时候,空节点我们使用’#‘来标志,val直接我们使用’,'来分割。
反系列化的时候,因为递归的时候,str的值要相应改变,要么使用char* &str或者char** str。
具体过程看代码。
3.源代码
char* Serialize(TreeNode *root) {
if(root == NULL)
return "#";
string value = to_string(root->val);
value.push_back(',');
char* left = Serialize(root->left);
char* right = Serialize(root->right);
//合并字符串
char* res = new char[strlen(left) + strlen(right) + value.size()];
strcpy(res,value.c_str());
strcat(res,left);
strcat(res,right);
return res;
}
TreeNode* decode(char* &str)
{
if(*str == '#')
{
++str;
return NULL;
}
int num = 0;
while(*str != ',')
num = 10 * num + *str++ - '0';
//跳过字符','
++str;
TreeNode* root = new TreeNode(num);
root->left = decode(str);
root->right = decode(str);
return root;
}
TreeNode* Deserialize(char *str) {
return decode(str);
}