题目描述:
序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据。
请设计一个算法来实现二叉树的序列化与反序列化。这里不限定你的序列 / 反序列化算法执行逻辑,你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构。
示例:
你可以将以下二叉树:
1
/ \
2 3
/ \
4 5
序列化为 "[1,2,3,null,null,4,5]"
提示: 这与 LeetCode 目前使用的方式一致,详情请参阅 LeetCode 序列化二叉树的格式。你并非必须采取这种方式,你也可以采用其他的方法解决这个问题。
说明: 不要使用类的成员 / 全局 / 静态变量来存储状态,你的序列化和反序列化算法应该是无状态的。
思路:
使用先序遍历将树转化为字符串,将null子树用#代替,然后再按照先序的方式还原
代码如下:
/**
* 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.
void serializeCore(TreeNode* root, string &s){
if(root == NULL){
s += "# ";
return;
}
s += to_string(root->val) + " ";
serializeCore(root->left, s);
serializeCore(root->right, s);
}
string serialize(TreeNode* root) {
string s = "";
serializeCore(root, s);
s.pop_back();
return s;
}
// Decodes your encoded data to tree.
TreeNode* deserializeCore(vector &data, int &len, int &n) {
TreeNode* node = NULL;
if(data[n] == "#"){//说明这里是null
return node;
}
else{
node = new TreeNode(stoi(data[n]));
}
TreeNode* leftnode = NULL, * rightnode = NULL;
n++;
if(n <= len - 2){
leftnode = deserializeCore(data, len, n);
n++;
rightnode = deserializeCore(data, len, n);
}
node->left = leftnode;
node->right = rightnode;
return node;
}
TreeNode* deserialize(string data) {
if(data == "#" || data == "") return NULL;
int len = 0;
vector list_s;
string s = "";
for(auto d: data){
if(d == ' '){
list_s.push_back(s);
s = "";
len++;
}
else s.push_back(d);
}
list_s.push_back(s);
len++;
int n = 0;
TreeNode* root = deserializeCore(list_s, len, n);
return root;
}
};
// Your Codec object will be instantiated and called as such:
// Codec codec;
// codec.deserialize(codec.serialize(root));