问题
来源: LintCode7
设计一个算法,并编写代码来序列化和反序列化二叉树。将树写入一个文件被称为“序列化”,读取文件后重建同样的二叉树被称为“反序列化”。
如何反序列化或序列化二叉树是没有限制的,你只需要确保可以将二叉树序列化为一个字符串,并且可以将字符串反序列化为原来的树结构。
如上图所示是通过前序遍历(深度优先搜索DFS)的方式进行二叉树序列化的过程。
实现
/**
* buildTree.cpp
*
* seralize & deseralize a binary tree with DFS
*/
#include<iostream>
#include<string>
using namespace std;
struct TreeNode {
int val;
TreeNode *left, *right;
TreeNode(int val) {
this->val = val;
this->left = this->right = NULL;
}
};
// classTreeNode {
// public:
// int val;
// TreeNode *left, *right;
// TreeNode(int val) {
// this->val = val;
// this->left = this->right = NULL;
// }
// };
void SerializeCore(const TreeNode* pRoot, string& stream)
{
if (pRoot == nullptr)
{
stream += "#,";
return;
}
//stream << pRoot->val << ',';
stream += to_string(pRoot->val);
stream += ',';
SerializeCore(pRoot->left, stream);
SerializeCore(pRoot->right, stream);
}
string serialize(TreeNode * root) {
// write your code here
string str = "{";
SerializeCore(root, str);
str += "}";
return str;
}
TreeNode * deserializeCore(string &data)
{
if (data.empty()) return nullptr;
if ('#' == data.substr(data.find_first_not_of(' '), 1).data()[0])
{
data = data.substr(data.find_first_of(',') + 1);
return NULL;
}
TreeNode *ret = new TreeNode(stoi(data));
data = data.substr(data.find_first_of(',') + 1);
ret->left = deserializeCore(data);
ret->right = deserializeCore(data);
return ret;
}
TreeNode * deserialize(string &data) {
// write your code here
if (data.empty())
return NULL;
data = data.substr(1, data.length() - 2);
TreeNode * ret = deserializeCore(data);
return ret;
}
int main()
{
//TreeNode * root = new TreeNode(1);
//TreeNode *l1 = new TreeNode(2);
//TreeNode *r1 = new TreeNode(3);
//TreeNode *l1l = new TreeNode(4);
//TreeNode *l1r = new TreeNode(5);
//TreeNode *r1l = new TreeNode(6);
//TreeNode *r1r = new TreeNode(7);
//TreeNode *r2l = new TreeNode(8);
//TreeNode *r3r = new TreeNode(9);
//root->left = l1;
//root->right = r1;
//l1->left = l1l;
//l1->right = l1r;
//r1->left = r1l;
//r1->right = r1r;
//r1l->left = r2l;
//r2l->right = r3r;
//string str = serialize(root);
//cout << str << endl;
string str("{11, 2, 4, #, #, 5, #, #, 3, 6, 8, #, 9, #, #, #, 7, #, #, }");
TreeNode* root = deserialize(str);
return 0;
}