题解 | #序列化二叉树# 层序遍历+详细注释
序列化二叉树
https://www.nowcoder.com/practice/cf7e25aa97c04cc1a68c8f040e71fb84
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};
*/
#include <cstdio>
#include <cstring>
#include <vector>
class Solution {
public:
char* Serialize(TreeNode* root) {
// 用string来方便地保存字符串
string res;
// 考虑树根为空的特殊情况
if (root == nullptr) {
return "#";
}
// 为层序遍历创建一个队列
queue<TreeNode*> que;
// 统计该层有多少个空指针
que.push(root);
int nul_num = 0;
while (!que.empty() ) {
int n = que.size();
if (nul_num == n) {
// 如果一层全为空,则直接可以结束循环去构建返回值
break;
} else {
// 如果不全为空,则清空计数器,方便统计下一层的空指针的个数
nul_num = 0;
}
for (int i = 0; i < n; i++) {
TreeNode* tmp = que.front();
que.pop();
// 层序遍历的队列更新逻辑
if (tmp == nullptr) {
// 由于层序遍历的逻辑,空指针必须加入到队列
que.push(nullptr);
que.push(nullptr);
// 更新计数器
nul_num += 2;
} else {
que.push(tmp->left);
que.push(tmp->right);
// 更新计数器
if (tmp -> left == nullptr) nul_num++;
if (tmp -> right == nullptr) nul_num++;
}
// 处理字符串逻辑,这里的逗号特别重要,否则在反序列化的时候会难以区分10 和 1 0
if (tmp == nullptr) {
res += "#,";
} else {
res += to_string(tmp->val);
res += ",";
}
}
}
// 注意这里的代码,没怎么写过,这是针对 char* 返回值的对策
char* charRes = new char[res.size() + 1];
// 和C语言相关的返回字符串,记住相关函数
strcpy(charRes, res.c_str());
// 需要手动更改数组的最后一个值
charRes[res.size()] = '\0';
printf("%s",charRes);
return charRes;
}
TreeNode* Deserialize(char* str) {
int n = strlen(str);
cout <<"n:" << n << endl;
// 处理元素较小的特殊情况
if (str[0] == '#') {
return nullptr;
}
// 按照下标存储节点,方便后续操作
vector<TreeNode*> help;
// 统计每个节点对应的字符串,以 ',' 为分割
string s;
int loc = 0;
// 遍历整个字符串,同时构造“节点数组”,方便后续操作
while(loc < n){
if(str[loc] != ','){
s += str[loc];
}else{
if(s == "#"){
help.push_back(nullptr);
s.clear();
}else{
help.push_back(new TreeNode(stoi(s)));
s.clear();
}
}
loc++;
}
// 组成树,这里的左右指针方式由层序遍历的逻辑决定。
for (int i = 0; i < help.size(); i++) {
if (help[i] != nullptr) {
if (2 * i + 2 < help.size()) {
help[i] -> left = help[2 * i + 1];
help[i] -> right = help[2 * i + 2];
} else {
help[i] -> left = nullptr;
help[i] -> right = nullptr;
}
}
}
return help[0];
}
};
