序列化是将数据结构或对象转换为一系列位的过程,以便它可以存储在文件或内存缓冲区中,或通过网络连接链路传输,以便稍后在同一个或另一个计算机环境中重建。
设计一个算法来序列化和反序列化 二叉搜索树 。 对序列化/反序列化算法的工作方式没有限制。 您只需确保二叉搜索树可以序列化为字符串,并且可以将该字符串反序列化为最初的二叉搜索树。
编码的字符串应尽可能紧凑。
示例 1:
输入:root = [2,1,3]
输出:[2,1,3]
示例 2:
输入:root = []
输出:[]
提示:
- 树中节点数范围是
[0, 10]
0 <= Node.val <= 10
题目数据 保证 输入的树是一棵二叉搜索树。
注意:不要使用类成员/全局/静态变量来存储状态。 你的序列化和反序列化算法应该是无状态的。
// Encodes a tree to a single string.
string serialize(TreeNode* root) {
if(root == nullptr)
return "#";
return to_string(root->val) + ' ' + serialize(root->left) + ' ' + serialize(root->right);
}
// Decodes your encoded data to tree.
TreeNode* rebuildTree(stringstream &ss){
string tmp;
ss >> tmp;
if(tmp == "#")
return nullptr;
TreeNode* node = new TreeNode(stoi(tmp));
node->left = rebuildTree(ss);
node->right = rebuildTree(ss);
return node;
}
TreeNode* deserialize(string data) {
stringstream ss(data);
return rebuildTree(ss);
}
递归超时
/**
* 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) {
if(root == NULL) return "#,";
return to_string(root->val)+"," + serialize(root->left)+serialize(root->right);
}
// Decodes your encoded data to tree.
TreeNode* deserialize(string data) {
vector<string> nodes = split(data);
int index = 0;
return deserialize(nodes, index);
}
TreeNode* deserialize(vector<string> data, int& index) {
const string s = data[index++] ;
if(s =="#") return NULL;
cout<<index<<":"<<s<<endl;
TreeNode* node = new TreeNode(stoi(s));
node->left = deserialize(data, index);
node->right = deserialize(data, index);
return node;
}
vector<string> split(string data){
vector<string> res;
int left = 0;
for(int i = 0; i<data.size();i++){
if(data[i] == ',' || i == data.size() - 1){
res.push_back(data.substr(left, i - left));
left = i+1;
}
}
return res;
}
};
// Your Codec object will be instantiated and called as such:
// Codec* ser = new Codec();
// Codec* deser = new Codec();
// string tree = ser->serialize(root);
// TreeNode* ans = deser->deserialize(tree);
// return ans;