37.序列化二叉树
请实现两个函数,分别用来序列化和反序列化二叉树。
示例:
你可以将以下二叉树:
1
/ \
2 3
/ \
4 5
序列化为 "[1,2,3,null,null,4,5]"
####BFS?
class Codec {
public:
// Encodes a tree to a single string.
string serialize(TreeNode* root) {
string result;
queue<TreeNode*> record;
record.emplace(root);
while (!record.empty()) {
size_t size = record.size();
while (size--) {
auto node = record.front();
if (node == nullptr) {
result.append("null,");
} else {
result.append(to_string(node->val)).push_back(',');
record.emplace(node->left);
record.emplace(node->right);
}
record.pop();
}
}
return result;
}
// Decodes your encoded data to tree.
TreeNode* deserialize(string data) {
vector<string> nodes = split(data);
if (nodes.empty() || nodes[0] == "null") {
return nullptr;
}
queue<TreeNode*> record;
TreeNode* node = new TreeNode(stoi(nodes.front()));
record.emplace(node);
for (int i = 0; i < nodes.size() - 1;) {
if (nodes[++i] != "null") {
record.front()->left = new TreeNode(stoi(nodes[i]));
record.emplace(record.front()->left);
}
if (nodes[++i] != "null") {
record.front()->right = new TreeNode(stoi(nodes[i]));
record.emplace(record.front()->right);
}
record.pop();
}
return node;
}
private:
vector<string> split(const string& str) {
vector<string> result;
size_t begin = 0;
size_t end = 0;
while (1) {
end = str.find(',', begin);
if (end == string::npos) {
break;
}
result.emplace_back(str.substr(begin, end - begin));
begin = end + 1;
}
return result;
}
};