思路:序列化的时候其实就是先序遍历二叉树,只不过遇到空节点的时候加上一个替代字符,比如'#'
反序列化就是读取上面序列化的字符。读到非'#' 和 ‘,’的字符就做为一个节点。
如果是'#'说明是空指针,程序递归结束。
class Solution {
public:
char* Serialize(TreeNode *root) {
if(root == nullptr)
return nullptr;
string str = "";
Serival(root, str);
int len = str.length();
char * res = new char[len + 1];
for(int i = 0; i < len; i++)
{
res[i] = str[i];
}
res[len] = '\0';
return res;
}
void Serival(TreeNode *root, string & str)
{
if(root == nullptr)
{
str += '#';
return ;
}
str += to_string(root->val);
str += ',';
Serival(root ->left, str);
Serival(root->right, str);
}
TreeNode* Deserialize(char *str) {
if(str == nullptr)
return nullptr;
return Des(str);
}
TreeNode * Des(char * &str)
{
if(*str == '#')
{
str++;
return nullptr;
}
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 = Des(str);
root ->right = Des(str);
return root;
}
};