题目详情
序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据。
请设计一个算法来实现二叉树的序列化与反序列化。这里不限定你的序列 / 反序列化算法执行逻辑,你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构。
示例:
你可以将以下二叉树:
1
/ \
2 3
/ \
4 5
序列化为 "[1,2,3,null,null,4,5]"
提示: 这与 LeetCode 目前使用的方式一致,详情请参阅 LeetCode 序列化二叉树的格式。你并非必须采取这种方式,你也可以采用其他的方法解决这个问题。
说明: 不要使用类的成员 / 全局 / 静态变量来存储状态,你的序列化和反序列化算法应该是无状态的。
——题目难度:困难
因为题目里说了“这里不限定你的序列 / 反序列化算法执行逻辑,你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构”,以题给示例的二叉树为例子,那么就可以将二叉树序列化为"1,2,3,null,null,4,5,"。
大致思路:序列化过程 使用bfs遍历整棵二叉树时,将该二叉树转化为一个字符串; 然后反序列化过程 就先调用split函数 将该字符串转为val[0], val[1], val[2]... ,然后再将这些val给连接成二叉树即可。
-代码如下
/**
* 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;
/*BFS遍历二叉树*/
queue<TreeNode*> que;
que.push(root);
while (!que.empty()) {
TreeNode* p = que.front(); //p为指向节点的指针
que.pop();
if (p) { //p不等于NULL
ans += to_string(p->val);
que.push(p->left);
que.push(p->right);
} else {
ans += "null";
}
ans += ",";
}
return ans;
}
// Decodes your encoded data to tree.
TreeNode* deserialize(string data) {
vector<string> vals = split(data);
if (vals[0] == "null") return NULL;
TreeNode* root = new TreeNode(stoi(vals[0]));
queue<TreeNode*> que; //队列que辅助构建二叉树
que.push(root);
for(int i = 1; i < vals.size();)
{
if (vals[i] != "null") {
TreeNode* p = new TreeNode(stoi(vals[i])); //p为指向节点的指针
que.push(p);
que.front()->left = p;
}
i++;
if (vals[i] != "null") {
TreeNode* p = new TreeNode(stoi(vals[i])); //p为指向节点的指针
que.push(p);
que.front()->right = p;
}
i++;
que.pop();
}
return root;
}
vector<string> split(string& data) {
vector<string> ans;
int start = 0;
while (1) {
auto end = data.find(',',start);
if (end == string::npos) break;
ans.push_back(data.substr(start, end-start));
start = end + 1;
}
return ans;
}
};
// Your Codec object will be instantiated and called as such:
// Codec codec;
// codec.deserialize(codec.serialize(root));