题目描述
请实现两个函数,分别用来序列化和反序列化二叉树
分析:
1.
对于序列化:使用前序遍历,递归的将二叉树的值转化为字符,并且在每次二叉树的结点
不为空时,在转化val所得的字符之后添加一个'
, '作为分割。对于空节点则以 '#' 代替。
2.
对于反序列化:按照前序顺序,递归的使用字符串中的字符创建一个二叉树。
/*
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="";
Serializestr(root,str); //用string来存储先序遍历的二叉树序列
char *res=new char[str.size()+1];
for(int i=0; i<str.size(); ++i)
res[i]=str[i]; //将string字符串赋值给char*
res[str.size()]='\0';
return res;
}
void Serializestr(TreeNode* root, string &str) //保存每次递归时的str值
{
if(root==NULL)
{
str+="#,"; //到达根节点或叶子结点时,添加一个#表示接在叶子结点后的空指针NULL
return;
}
str+=to_string(root->val)+",";
Serializestr(root->left,str); // 遍历左子树
Serializestr(root->right,str); //遍历右子树
}
TreeNode* Deserialize(char *str) {
if(str==NULL||str[0]=='\0') return NULL;
int num=0;
return Deserializenum(str,num); //递归过程需要记录遍历到哪个位置
}
TreeNode* Deserializenum(char* str,int &num)
{
int val=0;
if(str[num]=='#')
{
num+=2;
return NULL;
}
while(str[num]!=','&&str[num]!='\0') //逗号分隔各个节点的值
{
val=val*10+str[num]-'0'; //将各个节点的字符串转换成整数
++num;
}
++num;
TreeNode* root=new TreeNode(val); //创建二叉树的各个节点
root->left=Deserializenum(str,num);
root->right=Deserializenum(str,num);
return root;
}
};