题目分析:[[EVD]] - 剑指 Offer 37. 序列化二叉树
https://leetcode-cn.com/problems/xu-lie-hua-er-cha-shu-lcof/
简单描述:
- 请实现两个函数,分别用来序列化和反序列化二叉树。
- 你需要设计一个算法来实现二叉树的序列化与反序列化。这里不限定你的序列 / 反序列化算法执行逻辑,你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构。
- 提示:输入输出格式与 LeetCode 目前使用的方式一致,详情请参阅 LeetCode 序列化二叉树的格式。你并非必须采取这种方式,你也可以采用其他的方法解决这个问题。
限制🚫
示例:
输入:root = [1,2,3,null,null,4,5]
输出:[1,2,3,null,null,4,5]
解题思路:
思路:
- #广搜BFS 层序遍历,字符串化
效率:
- 时间复杂度
- 空间复杂度
代码:
class Codec
{
public:
// Encodes a tree to a single string.
string serialize(TreeNode *root)
{
if (root == nullptr)
return "";
queue<TreeNode *> q;
string res = "";
q.push(root);
while (!q.empty())
{
TreeNode *tmp = q.front();
q.pop();
if (tmp)
{
res.append(to_string(tmp->val));
res.append(" ");
q.push(tmp->left);
q.push(tmp->right);
}
else
{
res.append("null ");
}
}
return res;
}
// Decodes your encoded data to tree.
TreeNode *deserialize(string data)
{
if (data.empty())
return nullptr;
string val;
istringstream input(data);
vector<TreeNode *> res;
while (input >> val)
{
if (val == "null")
res.push_back(nullptr);
else
res.push_back(new TreeNode(atoi(val.c_str())));
}
for (int i = 0, j = 0; i < res.size() && j<res.size(); i++)
{
if (res[i] != nullptr)
{
res[i]->left = res[++j];
res[i]->right = res[++j];
}
}
return res[0];
}
};