序列化二叉树(六十一)

题目描述:
请实现两个函数,分别用来序列化和反序列化二叉树

代码(已在牛客 AC)

这道题呢, 可以使用二叉树的前序遍历将二叉树进行序列化, 由于用的是 C++, 因此使用 ​​<sstream>​​​ 中定义的 ​​ostringstream​​​ 和 ​​istringstream​​ 还是非常方便的.

使用 ​​serialize(root, out)​​​ 函数对二叉树进行前序遍历, 如果遇到空节点, 那么输出 ​​#​​​ 后直接返回; 否则输出 ​​root->val​​​. 之后要将 ​​ostringstream​​​ 中的字符拷出来, 应该使用 ​​out.str()​​​ 返回保存的字符串, 而要后的 C 风格的字符串, 需要调用 ​​c_str()​​ 方法.

对于反序列化, 使用 ​​deserialize​​​ 方法实现, 其中还使用了 ​​istringstream​​​ 对象, 使用前序遍历, 对于输入到 ​​val​​​ 中的值, 判断它是否为 ​​#​​​, 如果是的话, 那么说明是空节点, 返回 ​​nullptr​​​, 否则返回 ​​TreeNode(stoi(val))​​.

class Solution {
public:
char* Serialize(TreeNode *root) {
ostringstream out;
serialize(root, out);
char *res = new char[out.str().length() + 1];
strcpy(res, out.str().c_str());
return res;
}
TreeNode* Deserialize(char *str) {
istringstream in(str);
return deserialize(in);
}
private:
// 不论是序列化还是反序列化, 都使用二叉树的前序遍历.
void serialize(TreeNode *root, ostringstream &out) {
if (!root) { out << "# "; return; }
out << root->val << " ";
serialize(root->left, out);
serialize(root->right, out);
}

TreeNode* deserialize(istringstream &in) {
string val;
in >> val;
if (val == "#") return nullptr;
TreeNode *root = new TreeNode(stoi(val));
root->left = deserialize(in);
root->right = deserialize(in);
return root;
}
};