序列化是将数据结构或对象转换为一系列位的过程,以便它可以存储在文件或内存缓冲区中,或通过网络连接链路传输,以便稍后在同一个或另一个计算机环境中重建。
设计一个算法来序列化和反序列化 二叉搜索树 。 对序列化/反序列化算法的工作方式没有限制。 您只需确保二叉搜索树可以序列化为字符串,并且可以将该字符串反序列化为最初的二叉搜索树。
编码的字符串应尽可能紧凑。

示例 1:

  1. 输入:root = [2,1,3]
  2. 输出:[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;