序列化二叉树(六十一)
题目描述:
请实现两个函数,分别用来序列化和反序列化二叉树
代码(已在牛客 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;
}
};