序列化是将数据结构或对象转换为一系列位的过程,以便它可以存储在文件或内存缓冲区中,或通过网络连接链路传输,以便稍后在同一个或另一个计算机环境中重建。
设计一个算法来序列化和反序列化 二叉搜索树 。 对序列化/反序列化算法的工作方式没有限制。 您只需确保二叉搜索树可以序列化为字符串,并且可以将该字符串反序列化为最初的二叉搜索树。
编码的字符串应尽可能紧凑。
示例 1:
输入:root = [2,1,3]
输出:[2,1,3]
示例 2:
输入:root = []
输出:[]
提示:
树中节点数范围是 [0, 104]
0 <= Node.val <= 104
题目数据 保证 输入的树是一棵二叉搜索树。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/serialize-and-deserialize-bst
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
基本思路:前序遍历序列化,前序遍历反序列化,用stringstream 读取和取出string的缓冲,空节点用特殊字符表示。
// Encodes a tree to a single string.
string serialize(TreeNode* root) {
if(root==nullptr)
return string();
stringstream ss;
dfs(root,ss);
return ss.str();
}
void dfs(TreeNode * &root,stringstream &ss){
if(root==nullptr){
ss<<"# ";
return;
}
ss<<root->val<<" ";
dfs(root->left,ss);
dfs(root->right,ss);
}
void rebuild(TreeNode * &root,stringstream &ss){
string t;
ss>>t;
if(t=="#"){
root=nullptr;
return;
}
//cout<<t<<endl;
int num=stoi(t);
root=new TreeNode(num);
cout<<root->val<<endl;
rebuild(root->left,ss);
rebuild(root->right,ss);
}
// Decodes your encoded data to tree.
TreeNode* deserialize(string data) {
if(data.empty())
return nullptr;
TreeNode *root=NULL;
stringstream ss(data);
cout<<ss.str()<<endl;
rebuild(root,ss);
cout<<root->val<<endl;
return root;
}
基本思路:层次遍历
string serialize(TreeNode* root) {
if(root==nullptr){
return string();
}
stringstream ss;
queue<TreeNode *> q;
q.push(root);
while(!q.empty()){
int len=q.size();
while(len--){
TreeNode *tmp=q.front();
q.pop();
if(tmp==nullptr){
ss<<"#,";
}
else{
ss<<tmp->val<<",";
q.push(tmp->left);
q.push(tmp->right);
}
}
}
//cout<<"serialize: "<<str<<endl;
return ss.str();
}
// Decodes your encoded data to tree.
TreeNode* deserialize(string data) {
if(data.empty())
return nullptr;
stringstream ss(data);
string tmp;
queue<TreeNode **> q;
TreeNode *root=nullptr;
q.push(&root);
while(getline(ss,tmp,',')){
TreeNode **cur=q.front();
q.pop();
//cout<<tmp<<endl;
if(tmp=="#"){
*cur=nullptr;
}
else{
int num=stoi(tmp);
*cur=new TreeNode(num);
q.push(&(*cur)->left);
q.push(&(*cur)->right);
}
}
return root;
}
// Encodes a tree to a single string.
string serialize(TreeNode* root) {
if(!root) return "";
stringstream ss;
queue<TreeNode*> Q;
Q.push(root);
while(Q.size()){
TreeNode* p = Q.front();Q.pop();
if(!p) ss <<"# ";
else{
ss << p->val <<" ";
Q.push(p->left);
Q.push(p->right);
}
}
return ss.str();
}
// Decodes your encoded data to tree.
TreeNode* deserialize(string data) {
if(data.empty()) return NULL;
stringstream ss(data);
string t;
ss >> t;
TreeNode* rt = new TreeNode(stoi(t));
queue<TreeNode*> Q;
Q.push(rt);
while(Q.size()){
TreeNode* p = Q.front();Q.pop();
ss >> t; //其左右子节点一定是成对出现的
if(t[0] == '#'){
p->left = NULL;
}else{
p->left = new TreeNode(stoi(t));
Q.push(p->left);
}
ss >> t;
if(t[0] == '#'){
p->right = NULL;
}else{
p->right = new TreeNode(stoi(t));
Q.push(p->right);
}
}
return rt;
}