剑指 Offer 37. 序列化二叉树https://leetcode.cn/problems/xu-lie-hua-er-cha-shu-lcof/
序列化的方式有很多种,关键是在 序列化和反序列化 要一一对应
按遍历方式可以分为 前序、中序、后序、层序遍历
对字符串的表示也有差异,用一个什么 符号/类型/数据 去表示空指针,是否需要表示 等等;是否一定要用字符串表示呢、用别的数据类型 像数组 行不行呢
这些都是值得思考的问题
class Codec {
public:
string s;
void serTraverse(TreeNode* root)
{
// base case
if (root == nullptr)
{
s.append("n,");
return;
}
s.append(to_string(root->val));
s.push_back(',');
serTraverse(root->left);
serTraverse(root->right);
}
// Encodes a tree to a single string.
string serialize(TreeNode* root) {
s.clear();
serTraverse(root);
return s;
}
TreeNode* deserTraverse(int& index)
{
// base case
if (s[index] == 'n')
{
index += 2;
return nullptr;
}
// 读取当前节点值
int temp = index;
while (s[index++] != ',') {}
TreeNode* cur = new TreeNode(stoi(s.substr(temp, index - temp - 1)));
cur->left = deserTraverse(index);
cur->right = deserTraverse(index);
return cur;
}
// Decodes your encoded data to tree.
TreeNode* deserialize(string data) {
// base case
if (data.empty())
{
return nullptr;
}
s.assign(data);
int index = 0;
return deserTraverse(index);
}
};