- 序列化二叉树即找一种顺序存储二叉树的节点,并以相同的方式能够读取序列重新构建。
- 换种说法,就是遍历二叉树,记录每个节点,再以同样的方式遍历就可以还原二叉树。
PS:能基于序列化字符串单独还原树的情况:
- 层次遍历序列(需标记空节点)。
- 前序或后序遍历序列(需结合中序,或显式标记空节点,如
[1,2,null,null,3])。若序列化时未标记空节点,则只有层次遍历或前序+中序/后序+中序的组合能唯一还原。
本题,可以参考牛客做法,用前序遍历来实现序列化与反序列化。
class Solution {
public:
string dfs(TreeNode* root){
if(root == nullptr) return "#";
string str;
str += to_string(root->val) + "!"; // 用!分割数字 以免出现13和1、3混淆这种情况
str += dfs(root->left);
str += dfs(root->right);
return str;
}
TreeNode* deserialHandle(char* &str){
if(*str == '#'){
// 如果是# 忽略 找下一个
return nullptr;
}
int num = 0;
while(*str != '!'){
num = num * 10 + (*str) - '0';
str++;
}
TreeNode* node = new TreeNode(num);
node->left = deserialHandle(++str);
node->right = deserialHandle(++str);
return node;
}
char* Serialize(TreeNode *root) {
string str = dfs(root);
char *res = new char[str.size() + 10];
for(int i = 0; i < str.size(); ++i){
res[i] = str[i];
}
return res;
}
TreeNode* Deserialize(char *str) {
return deserialHandle(str);
}
};