449. 序列化和反序列化二叉搜索树
449. 序列化和反序列化二叉搜索树
序列化是将数据结构或对象转换为一系列位的过程,以便它可以存储在文件或内存缓冲区中,或通过网络连接链路传输,以便稍后在同一个或另一个计算机环境中重建。
设计一个算法来序列化和反序列化 二叉搜索树 。 对序列化/反序列化算法的工作方式没有限制。 您只需确保二叉搜索树可以序列化为字符串,并且可以将该字符串反序列化为最初的二叉搜索树。
编码的字符串应尽可能紧凑。
示例 1:
输入:root = [2,1,3]
输出:[2,1,3]
示例 2:
输入:root = []
输出:[]
提示:
- 树中节点数范围是
[0, 104]
0 <= Node.val <= 104
- 题目数据 保证 输入的树是一棵二叉搜索树。
思路:
本题类似于二叉树的序列化与反序列化,对于BST来说,他的前序遍历第一个数是根节点。在序列化时,利用分隔符将所有数据都存入string中。在反序列化时,先将数据分开来存进容器里,在去在[min,max]闭区间中去构造BST,左节点都比根节点小,右节点都比根节点大
class Codec {
public:
string a="";
// Encodes a tree to a single string.
string serialize(TreeNode* root) {
//前序遍历
if(root==NULL)return a;
//用,分隔开每个数
a+=to_string(root->val)+',';
serialize(root->left);
serialize(root->right);
return a;
}
// Decodes your encoded data to tree.
TreeNode* deserialize(string data) {
//cout<<data;
//反序列化
//先将每个节点的数取出来
vector<string>nodes;
int n=data.size();
string s="";
for(int i=0;i<n;i++){
//每遇到, 就记入一个数据
if(data[i]==','){
nodes.push_back(s);
s="";
}else{
s+=data[i];
//cout<<s<<endl;
}
}
return deserialize(nodes,INT_MIN,INT_MAX);
}
//利用nodes容器,在[min,max]中构造一个BST
TreeNode* deserialize(vector<string>&nodes,int min,int max){
if(nodes.empty())return NULL;
//利用前序遍历进行反序列化
//容器的第一个元素就是根节点
int rootVal=stoi(nodes.front());
if (rootVal > max || rootVal < min) {
// 超过闭区间 [min, max],则返回空指针
return NULL;
}
TreeNode* root=new TreeNode(rootVal);
nodes.erase(nodes.begin());
//递归 构造左右子树 BST左子树小于根节点 右子树大于根节点
root->left=deserialize(nodes,min,rootVal);
root->right=deserialize(nodes,rootVal,max);
return root;
}
};
空间复杂度和时间复杂度都太高,只超过了5%。:(
本文来自博客园,作者:{BailanZ},转载请注明原文链接:https://www.cnblogs.com/BailanZ/p/16151925.html