题目:
请实现两个函数,分别用来序列化和反序列化二叉树。
思路:
序列化二叉树时,用前序遍历的思路,为了后面的反序列化,还需要将叶节点的左右空子树也存下来,可以用“$”表示。另外,因为每个节点的值可能不只是一位数,所以需要在结果序列中用“,”隔开。
序列化时,由于string类型操作起来更方便,所以先将结果保存到string中,然后将string中的字符复制到字符数组中。注意字符数组的末尾要补一个'\0'。
参考代码:
在线测试
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;
SerializeInorder(root, str);
char *tree=new char[str.size()+1];
for(int i=0;i<str.size();i++)
{
tree[i]=str[i];
}
tree[str.size()]='\0';
return tree;
}
//因为要带回改变的值,所以要用引用传递
void SerializeInorder(TreeNode *root, string &str)
{
if(root==NULL)
{
str+='$';//空节点
return;
}
string temp=to_string(root->val);//int型转换为string
str+=temp;
str+=',';//数字以,间隔
SerializeInorder(root->left, str);
SerializeInorder(root->right, str);
}
TreeNode* Deserialize(char *str) {
if(str==NULL || *str=='\0')
return NULL;
TreeNode* root=DeserializeCore(&str);
return root;
}
//因为str的值会改变,所以要用双指针
TreeNode* DeserializeCore(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)++;
root->left=DeserializeCore(str);
root->right=DeserializeCore(str);
return root;
}
};