剑指 Offer 37. 序列化二叉树
知识点:二叉树、bfs、dfs
时间:2020年4月26日
题目链接
题目
请实现两个函数,分别用来序列化和反序列化二叉树。
示例:
你可以将以下二叉树:
1
/ \
2 3
/ \
4 5
序列化为 “[1,2,3,null,null,4,5]”
代码
#include "cheader.h"
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
class Codec
{
public:
//BFS
string serialize(TreeNode* root)
{
string res = "";
if (root == NULL)
return "";
queue<TreeNode*> q;
q.push(root);
while (!q.empty())
{
TreeNode* p = q.front();
q.pop();
if (p == nullptr)
res += "NULL,";
else
{
res += to_string(p->val);
res += ',';
q.push(p->left);
q.push(p->right);
}
}
return res;
}
//DFS
string res_str = "";
void dfs(TreeNode * root)
{
if (root == NULL)
{
res_str += "NULL,";
return;
}
res_str += to_string(root->val);
res_str += ',';
dfs(root->left);
dfs(root->right);
}
string serialize2(TreeNode* root)
{
dfs(root);
return res_str;
}
// Decodes your encoded data to tree.
TreeNode* deserialize(string data)
{
vector<string> rec;
if (data.size() == 0)
return nullptr;
int i = 0, j = 0;
while (i < data.size())
{
if (data[i] != ',')
++i;
else
{
string tmp = data.substr(j, i - j);
rec.push_back(tmp);
i++;
j = i;
}
}
if (j != i)
{
string tmp = data.substr(j, i - j);
rec.push_back(tmp);
}
TreeNode * root = new TreeNode(stoi(rec[0]));
queue<TreeNode*> q;
q.push(root);
i = 1;
while (!q.empty())
{
TreeNode* p = q.front();
q.pop();
if (rec[i] != "NULL")
{
p->left = new TreeNode(stoi(rec[i]));
q.push(p->left);
}
i++;
if (rec[i] != "NULL")
{
p->right = new TreeNode(stoi(rec[i]));
q.push(p->right);
}
i++;
}
return root;
}
};
今天也是爱zz的一天哦!