449. 序列化和反序列化二叉搜索树

序列化是将数据结构或对象转换为一系列位的过程,以便它可以存储在文件或内存缓冲区中,或通过网络连接链路传输,以便稍后在同一个或另一个计算机环境中重建。

设计一个算法来序列化和反序列化二叉搜索树。 对序列化/反序列化算法的工作方式没有限制。 您只需确保二叉搜索树可以序列化为字符串,并且可以将该字符串反序列化为最初的二叉搜索树。

编码的字符串应尽可能紧凑。

注意:不要使用类成员/全局/静态变量来存储状态。 你的序列化和反序列化算法应该是无状态的。

/**

 * 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:

    void change_int(int val,string& str_val)

    {

        string tmp;

        while(val)

        {

            tmp += val % 10 + '0';

            val = val / 10;

        }

        for(int i = tmp.size() - 1;i >= 0;i--)

            str_val += tmp[i];

        str_val += '#';

    }

    void dfs(TreeNode* node,string& str)

    {

        if(!node)

            return;

        string str_val;

        change_int(node->val,str_val);

        str = str + str_val;

        dfs(node->left,str);

        dfs(node->right,str);

    }

    // Encodes a tree to a single string.

    string serialize(TreeNode* root) {

        string str;

        dfs(root,str);

        return str;

    }

    void insert(TreeNode* root,TreeNode* node)

    {   

        if(node->val < root->val)

        {

            if(root->left)

                insert(root->left,node);

            else

                root->left = node;

        }

        else

        {

            if(root->right)

                insert(root->right,node);

            else

                root->right = node;

        }

    }

    // Decodes your encoded data to tree.

    TreeNode* deserialize(string data) {

        if(data.size() == 0)

            return NULL;

        vector<TreeNode*> vec;

        int val = 0;

        for(int i = 0;i < data.size();i++)

        {

            if(data[i] == '#')

            {

                vec.push_back(new TreeNode(val));

                val = 0;

            }

            else

            {

                val = val * 10 + data[i] - '0';

            }

        }

        for(int i = 1;i < vec.size();i++)

        {

            insert(vec[0],vec[i]);

        }

        return vec[0];

    }

};

// Your Codec object will be instantiated and called as such:

// Codec codec;

// codec.deserialize(codec.serialize(root));

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容