请实现两个函数,分别用来序列化和反序列化二叉树。
示例:
你可以将以下二叉树:
1
/ \
2 3
/ \
4 5
序列化为 "[1,2,3,null,null,4,5]"
注意:本题与主站 297 题相同:https://leetcode-cn.com/problems/serialize-and-deserialize-binary-tree/
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Codec {
public:
// Encodes a tree to a single string.
string serialize(TreeNode* root) {
vector<TreeNode*> nodes;
queue<TreeNode*> q;
q.push(root);
while (!q.empty())
{
int size = q.size();
while (size--)
{
nodes.push_back(q.front());
if (q.front())
{
q.push(q.front()->left);
q.push(q.front()->right);
}
q.pop();
}
}
string s;
s += (nodes[0] == NULL ? "N" : to_string(nodes[0]->val));
for (int i = 1; i < nodes.size(); ++i)
s += "," + (nodes[i] == NULL ? "N" : to_string(nodes[i]->val));
return s;
}
// Decodes your encoded data to tree.
TreeNode* deserialize(string data) {
queue<string> nodes;
char s[data.length() + 1];
strcpy(s, data.c_str());
char* token = strtok(s, ",");
while (token != NULL)
{
nodes.push(token);
token = strtok(NULL, ",");
}
if (nodes.front() == "N")
return NULL;
TreeNode* root = new TreeNode(stoi(nodes.front()));
nodes.pop();
queue<TreeNode*> q;
q.push(root);
while (!q.empty())
{
if (nodes.front() == "N")
q.front()->left = NULL;
else
{
TreeNode* leftNode = new TreeNode(stoi(nodes.front()));
q.front()->left = leftNode;
q.push(leftNode);
}
nodes.pop();
if (nodes.front() == "N")
q.front()->right = NULL;
else
{
TreeNode* rightNode = new TreeNode(stoi(nodes.front()));
q.front()->right = rightNode;
q.push(rightNode);
}
nodes.pop();
q.pop();
}
return root;
}
};
// Your Codec object will be instantiated and called as such:
// Codec codec;
// codec.deserialize(codec.serialize(root));