序列化二叉树_牛客题霸_牛客网 (nowcoder.com)
二叉树的序列化(Serialize)是指:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字符串,从而使得内存中建立起来的二叉树可以持久保存。序列化可以基于先序、中序、后序、层序的二叉树等遍历方式来进行修改,序列化的结果是一个字符串,序列化时通过 某种符号表示空节点(#)
二叉树的反序列化(Deserialize)是指:根据某种遍历顺序得到的序列化字符串结果str,重构二叉树。
几个转换函数:
1. to_string : 将不同数据类型转换为字符串的函数,整数、浮点数、布尔值、字符等数据类2. 型转换为字符串类型。
char* charRes = new char[res.length() + 1];
strcpy(charRes, res.c_str());
class Solution {
public:
//处理序列化的功能函数(递归)
void SerializeFunction(TreeNode* root, string& str) {
//如果指针为空,表示左子节点或右子节点为空,用#表示
if (root == nullptr) {
str += '#';
return;
}
//根节点
string temp = to_string(root->val);
str += temp + '!';// 加!,区分节点
//左子树
SerializeFunction(root->left, str);
//右子树
SerializeFunction(root->right, str);
}
char* Serialize(TreeNode* root) {
//处理空树
if (root == nullptr)
return "#";
string res;
SerializeFunction(root, res);
//把str转换成char
char* charRes = new char[res.length() + 1];
strcpy(charRes, res.c_str());
charRes[res.length()] = '\0';
return charRes;
}
//处理反序列化的功能函数(递归)
TreeNode* DeserializeFunction(char** str) {
//到达叶节点时,构建完毕,返回继续构建父节点
//双**表示取值
if (**str == '#') {
(*str)++;
return nullptr;
}
//数字转换
int val = 0;
while (**str != '!' &&** str != '\0') {
val = val * 10 + ((**str) - '0');
(*str)++;
}
TreeNode* root = new TreeNode(val);
//序列到底了,构建完成
if (**str == '\0')
return root;
else
(*str)++;
//反序列化与序列化一致,都是前序
root->left = DeserializeFunction(str);
root->right = DeserializeFunction(str);
return root;
}
TreeNode* Deserialize(char* str) {
//空序列对应空树
if (str == "#") {
return nullptr;
}
TreeNode* res = DeserializeFunction(&str);
return res;
}
};