序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据。
请设计一个算法来实现二叉树的序列化与反序列化。这里不限定你的序列 / 反序列化算法执行逻辑,你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构。
示例:
你可以将以下二叉树:
1
/ \
2 3
/ \
4 5
序列化为 "[1,2,3,null,null,4,5]"
提示: 这与 LeetCode 目前使用的方式一致,详情请参阅 LeetCode 序列化二叉树的格式。你并非必须采取这种方式,你也可以采用其他的方法解决这个问题。
说明: 不要使用类的成员 / 全局 / 静态变量来存储状态,你的序列化和反序列化算法应该是无状态的。
来源:力扣(LeetCode)
链接: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:
// 前序遍历,将结果保存到链表中,如果遇到空子树保存 "#"
void dfs(TreeNode* root, list<string>& cutList){
if(root == NULL){
cutList.push_back("#");
return ;
}
string cut = ""; int x=root->val;
while(x){
cut.insert(cut.begin(),x%10 + '0');
x/=10;
}
cutList.push_back(cut);
dfs(root->left, cutList);
dfs(root->right, cutList);
}
string serialize(TreeNode* root) {
if(root == NULL) return "";
list<string> cutList;
dfs(root, cutList);
string str = "";
list<string>::iterator it;
for(it=cutList.begin();it!=cutList.end();it++) str+= *it + ",";
return str;
}
// 根据前序遍历结果递归的构建二叉树
TreeNode* dfs(list<string>& cut){
if(cut.front() == "#"){
cut.pop_front();
return NULL;
}
string temp = cut.front();
int res = 0, n = temp.length();
for(int k=0;k<n;k++) res = res * 10 + temp[k] -'0';
cut.pop_front();
TreeNode* rt = new TreeNode(res);
rt->left = dfs(cut);
rt->right = dfs(cut);
return rt;
}
// Decodes your encoded data to tree.
TreeNode* deserialize(string data) {
int len = data.length();
if(!len) return NULL;
int i=0; list<string> cut;
while(i<len){
int j=i;
while(j<len&&data[j]!=',') j++;
cut.push_back(data.substr(i,j-i));
i=j+1;
}
return dfs(cut);
}
};