/**
* 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)
{
queue<TreeNode*> que;
string strRes;
vector<string> vec;
char szSub[16];
if(!root)
return "null";
que.push(root);
while( !que.empty() )
{
if(que.front())
{
memset(szSub, 16, 0);
sprintf(szSub, "%d", que.front()->val);
vec.push_back(szSub);
}
else
vec.push_back("null");
if(que.front())
{
que.push(que.front()->left);
que.push(que.front()->right);
}
que.pop();
}
int nTail = 0;
for(nTail=vec.size()-1; nTail>=0; nTail--)
if(vec[nTail].compare("null") != 0)
break;
for(int i=0; i<=nTail-1; i++)
{
strRes += vec[i];
strRes += ",";
}
strRes += vec[nTail];
return strRes;
}
// Decodes your encoded data to tree.
TreeNode* deserialize(string data)
{
if(data.empty() || data.compare("null")==0)
return NULL;
queue<TreeNode*> que;
int i;
vector<string> vec = str2vec(data);
TreeNode* root = new TreeNode( atoi(vec[0].c_str()) );
que.push(root);
i = 1;
while(i<vec.size())
{
TreeNode* node = que.front();
if(vec[i].compare("null") != 0)
{
node->left = new TreeNode( atoi(vec[i].c_str()) );
que.push(node->left);
}
i++;
if(i<vec.size() && vec[i].compare("null") != 0)
{
node->right = new TreeNode( atoi(vec[i].c_str()) );
que.push(node->right);
}
i++;
que.pop();
}
return root;
}
private:
vector<string> str2vec(string str)
{
vector<string> vec;
if(str.empty())
return vec;
int i, j;
for(i=0, j=0; j<str.size(); j++)
{
if(str[j]==',')
{
vec.push_back(str.substr(i, j-i));
i = j+1;
}
}
vec.push_back(str.substr(i, j-i));
return vec;
}
};
// Your Codec object will be instantiated and called as such:
// Codec codec;
// codec.deserialize(codec.serialize(root));
二叉树的序列化和反序列化
最新推荐文章于 2020-02-19 18:06:11 发布