题目描述:
请实现两个函数,分别用来序列化和反序列化二叉树。
题目解析:
序列化:将一颗二叉树序列化,以前序遍历的顺序序列化,从根节点开始,将节点的值转换为字符,存入一个字符串中,每存一个值,再加上一个',' ,当遍历到空节点的时候,加上'#'。
反序列化:将一个字符串还原为一个二叉树,将字符0-9转换为字符 (ch - '0')。转换为整型后,创建一个节点其值为该整型。再递归的调用左子树和右子树。注意:递归的时候要使用char**,否则不能保证每次递归后指向字符串的指针会随递归而不断的移动。
AC代码:
/*
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 == NULL)
return NULL;
string str;
_Serialize(root,str);
char* ret = new char[str.length()+1];
int i;
for(i = 0;i < str.length();++i)
ret[i] = str[i];
ret[i] = '\0';
return ret;
}
void _Serialize(TreeNode* root,string& str)
{
if(root == NULL)
{
str += '#';
return;
}
string tmp = to_string(root->val);
str += tmp;
str += ',';
_Serialize(root->left,str);
_Serialize(root->right,str);
}
TreeNode* Deserialize(char *str) {
if(str == NULL)
return NULL;
TreeNode* ret = _Deserialize(&str);
return ret;
}
TreeNode* _Deserialize(char** str)
{
if(**str == '#')
{
++(*str);
return NULL;
}
int num = 0;
while(**str != '\0' && **str != ',')
{
num = num*10 + ((**str)-'0');
++(*str);
}
TreeNode* root = new TreeNode(num);
if(**str == '\0')
return root;
else{
//此时的**str=','
++(*str);
root->left = _Deserialize(str);
root->right = _Deserialize(str);
return root;
}
}
};
(*^▽^*)