题目:请实现两个函数,分别用来序列化和反序列化二叉树
序列化:得到层序序列 10,20,30,4,#,#,5,6,#,#,#,#,#,7,#,
反序列化:重建二叉树。
/*
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) { //注意返回值为char指针,应该用char数组
if(root==NULL) return NULL;
string record;
Serialize(root,record);
char* result=new char[record.length()+1];
unsigned int i=0;
for(;i<record.length();i++)
result[i]=record[i];
result[i]='\0';
return result;
}
void Serialize(TreeNode *root,string &str)
{
if(root==NULL) //不存在,为空节点,输入#,然后返回
{
str+="#,";
return;
}
str+=to_string(root->val)+','; //输入一次存在值
Serialize(root->left,str);
Serialize(root->right,str);
}
TreeNode* Deserialize(char *str) {
if(str==NULL) return NULL; //惯例检查是否为空
TreeNode* new_tree=Deserialize(&str);
return new_tree;
}
TreeNode* Deserialize(char **str) //传入二级指针才能更改
{
if(**str=='#')
{
(*str)+=2; //跳过逗号指向下一个字符
return NULL; //由于是空节点,不会返回实例
}
int num=0;
while(**str!='\0'&&**str!=',') //将字符串转为整数
{
num=num*10+(**str-'0');
(*str)++;
}
TreeNode* node=new TreeNode(num); //建立新节点
if(**str=='\0')
return node;
else
(*str)++;
node->left=Deserialize(str);
node->right=Deserialize(str);
return node;
}
};