
一、前言
本系列文章为《剑指Offer》刷题笔记。
刷题平台:牛客网
书籍下载:共享资源
二、题目
请实现两个函数,分别用来序列化和反序列化二叉树。
1、思路
这道题思路简单,使用前序遍历来序列化和发序列化即可。只要自己写的程序格式对应上即可。可以使用$符号表示NULL,同时每个结点之间,需要添加逗号,即’,’进行分隔。
直接看代码即可。
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){
return NULL;
}
string str;
SerializeCore(root, str);
// 把str流中转换为字符串返回
int length = str.length();
char* res = new char[length+1];
// 把str流中转换为字符串返回
for(int i = 0; i < length; i++){
res[i] = str[i];
}
res[length] = '\0';
return res;
}
TreeNode* Deserialize(char *str) {
if(!str){
return NULL;
}
TreeNode* res = DeserializeCore(&str);
return res;
}
void SerializeCore(TreeNode* root, string& str){
// 如果指针为空,表示左子节点或右子节点为空,则在序列中用#表示
if(!root){
str += '#';
return;
}
string tmp = to_string(root->val);
str += tmp;
// 加逗号,用于区分每个结点
str += ',';
SerializeCore(root->left, str);
SerializeCore(root->right, str);
}
// 递归时改变了str值使其指向后面的序列,因此要声明为char**
TreeNode* DeserializeCore(char** str){
// 到达叶节点时,调用两次,都返回null,所以构建完毕,返回父节点的构建
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 = DeserializeCore(str);
root->right = DeserializeCore(str);
return root;
}
};
来源:
https://cuijiahua.com/blog/2018/01/basis_61.html
