序列化是将数据结构或对象转换为一系列位的过程,以便它可以存储在文件或内存缓冲区中,或通过网络连接链路传输,以便稍后在同一个或另一个计算机环境中重建。
设计一个算法来序列化和反序列化二叉搜索树。 对序列化/反序列化算法的工作方式没有限制。 您只需确保二叉搜索树可以序列化为字符串,并且可以将该字符串反序列化为最初的二叉搜索树。
编码的字符串应尽可能紧凑。
注意:不要使用类成员/全局/静态变量来存储状态。 你的序列化和反序列化算法应该是无状态的。
通过次数5,827提交次数11,046
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/serialize-and-deserialize-bst
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路:
对于二叉搜索树而言,前序遍历之后可以根据前序遍历的结果对二叉树进行重建,即直接对二叉搜索树进行前序遍历获得序列结果,之后依照顺序按照二叉搜索树的规则进行二叉搜索树的构建即可,在本题中需要注意的是,二叉树的节点应该是多位的,在序列化的时候需要通过分隔符来确定节点数字的位数
注:二叉搜索树的前序遍历和后序遍历都可以确定唯一的一颗二叉搜索树,因为二叉搜索树的中序遍历是有序的,可以通过排序获得。
/**
* 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 ret = "";
preOrder(root,ret);
return ret;
}
// Decodes your encoded data to tree.
TreeNode* deserialize(string data) {
int len = data.size();
TreeNode* ret;
if(len==0)return nullptr;
int j = 0;
int headnum = 0;
while(data[j]!=' ')
{
headnum = headnum*10 + data[j]-'0';
j++;
}
j++;
ret = new TreeNode(headnum);
//TreeNode* p = ret;
for(int i = j; i < len; i ++)
{
TreeNode* p = ret;
int num = 0;
while(data[i]!=' ')
{
num = num*10 + data[i]-'0';
i++;
}
while(p)
{
if(num>p->val)
{
if(p->right)
{
p = p->right;
}
else
{
p->right = new TreeNode(num);
break;
}
}
else
{
if(p->left)
{
p = p->left;
}
else
{
p->left = new TreeNode(num);
break;
}
}
}
}
return ret;
}
void preOrder(TreeNode* node,string &ret)
{
if(node == nullptr)
return;
ret+=(to_string(node->val));
ret+=" ";
preOrder(node->left,ret);
preOrder(node->right,ret);
}
};
// Your Codec object will be instantiated and called as such:
// Codec codec;
// codec.deserialize(codec.serialize(root));