https://leetcode-cn.com/problems/serialize-and-deserialize-binary-tree/submissions/
可以用递归,比如前序遍历,注意,因为在序列化的时候,当某节点为null,做有标记,因此,在反序列化的时候,可以仍然前序递归,但此时,字符串流的状态要随之更新。
1,2,4,#,#,#,3,5,#,#,6,#,#
/**
* 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) {
if (root==NULL)return "#";
return to_string(root->val) + " " + serialize(root->left) + " " + serialize(root->right);
}
// Decodes your encoded data to tree.
TreeNode* deserialize(string data) {
istringstream ss(data);
return sovle(ss);
}
TreeNode* sovle(istringstream& ans)
{
string tmp;
ans>>tmp;
if (tmp=="#")return NULL;
TreeNode* node = new TreeNode(stoi(tmp));
node->left = sovle(ans);
node->right = sovle(ans);
return node;
}
};
// Your Codec object will be instantiated and called as such:
// Codec codec;
// codec.deserialize(codec.serialize(root));
序列化的方法并非一定要前序,层序也可以,此时用到BFS和队列。
在序列化的过程中,判断一下当前是否为空,空的化就不进行push操作,不空push左右子树。
反序列化的过程依然用到了 流的特点,即根据空格分离,依次读入,并建队建树
/**
* 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) {
string ans;
queue<TreeNode*>q;
if (root==NULL)return ans;
q.push(root);
while(!q.empty())
{
TreeNode* tmp = q.front();
q.pop();
if (tmp)
{
ans += to_string(tmp->val) + " ";
q.push(tmp->left);
q.push(tmp->right);
}
else
{
ans += "# ";
}
}
return ans;
}
// Decodes your encoded data to tree.
TreeNode* deserialize(string data) {
if (data.empty())return NULL;
istringstream ss(data);
queue<TreeNode* >q;
string tmp;
ss>>tmp;
TreeNode* node = new TreeNode(stoi(tmp));
q.push(node);
while(ss>>tmp)
{
TreeNode* node = q.front();
q.pop();
if (tmp=="#") node->left = NULL;
else
{
node->left = new TreeNode(stoi(tmp));
q.push(node->left);
}
ss>>tmp;
if (tmp=="#")node->right = NULL;
else
{
node->right = new TreeNode(stoi(tmp));
q.push(node->right);
}
}
return node;
}
};
// Your Codec object will be instantiated and called as such:
// Codec codec;
// codec.deserialize(codec.serialize(root));