实现两个函数,分别用于序列化和反序列化二叉树。
序列化二叉树,给定一棵二叉树,以某种方式遍历它,空孩子节点用'#'表示,数字之间用逗号分割开来。
比如
序列化的结果是:1,2,4,###3,5,##6,##
序列化过程,可以考虑二叉树的前序遍历方法进行序列化。
//将int型数据转换为str
string to_string(int val)
{
string res="";
while(val)
{
int num=val%10;
char temp=num+48;
res+=temp;
val/=10;
}
reverse(res.begin(),res.end());
return res;
}
string str="";
//序列化主函数
void S_core(TreeNode *root,string &str)
{
if(root==NULL)
{
str+='#';
return;
}
else
{
str+=to_string(root->val);
str+=',';
S_core(root->left,str);
S_core(root->right,str);
}
}
//序列化函数
char* Serialize(TreeNode *root) {
if(root==NULL)
return NULL;
S_core(root,str);
char *s=new char[str.size()+1];
for(int i=0;i<str.size();i++)
{
s[i]=str[i];
}
s[str.size()]='\0';
return s;
}
与序列化对应的反序列化也采用前序遍历的方式
注意D_core函数参数是引用,也可以用二级指针。
//反序列化主函数
TreeNode* D_core(char* &str)
{
if(*str=='#')
{
str++;
return NULL;
}
int num=0;
while(*str!=','&&*str!='\0')
{
num=num*10+*str-'0';
str++;
}
TreeNode *root=new TreeNode(num);
if(*str=='\0')
return root;
else
str++;
root->left=D_core(str);
root->right=D_core(str);
return root;
}
//反序列化函数
TreeNode* Deserialize(char *str) {
if(str==NULL)
return NULL;
else
return D_core(str);
}