Serialize and Deserialize BST

来源:互联网 发布:fluent软件官方下载 编辑:程序博客网 时间:2024/06/05 22:45

Serialize and Deserialize BST

Serialization is the process of converting a data structure or object into a sequence of bits so that it can be stored in a file or memory buffer, or transmitted across a network connection link to be reconstructed later in the same or another computer environment.

Design an algorithm to serialize and deserialize a binary search tree. There is no restriction on how your serialization/deserialization algorithm should work. You just need to ensure that a binary search tree can be serialized to a string and this string can be deserialized to the original tree structure.

The encoded string should be as compact as possible.

解析:

按先序遍历二叉树把每个节点地值存放在字符串中,解码时按对应的方式解码,由于要把数字存入字符串,每个数字之间使用分隔符。

在写的时候遇到很多问题,开始解码的函数使用的参数是(string s,int &pos)这样的形式,pos记录本次解码时s中起始位置,这个每次递归时

都要记录整个s字符串,会遇到内存溢出的问题,后来改进为(string &s),其中每次递归时都对s进行处理,s只记录当前需要的位置。

代码:

/** * 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 "$ ";        string ans=to_string(root->val)+" ";        ans+=serialize(root->left);        ans+=serialize(root->right);        return ans;          }    // Decodes your encoded data to tree.    TreeNode* deserialize(string data) {        int pos=0;        return Derseial(data);    }    TreeNode* Derseial(string &data)    {              int pos=0;       if (data[pos]=='$')       {           pos+=2;           data=data.substr(pos,data.size()-pos);           return NULL;       }      int endpos=data.size()-1;       for (int i=pos; i<data.size(); i++)       {           if (data[i]==' ')           {               endpos=i;               break;           }       }       int value=atoi(data.substr(pos,endpos-pos).c_str());       TreeNode *root=new TreeNode(value);       //pos=endpos;       data=data.substr(endpos+1,data.size()-endpos-1);       root->left=Derseial(data);       root->right=Derseial(data);       return root;    }};// Your Codec object will be instantiated and called as such:// Codec codec;// codec.deserialize(codec.serialize(root));


0 0