297. Serialize and Deserialize Binary Tree
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 tree. There is no restriction on how your serialization/deserialization algorithm should work. You just need to ensure that a binary tree can be serialized to a string and this string can be deserialized to the original tree structure.
For example, you may serialize the following tree
1 / \ 2 3 / \ 4 5as
"[1,2,3,null,null,4,5]"
, just the same as
how LeetCode OJ serializes a binary tree
. You do not necessarily need to follow this format, so please be creative and come up with different approaches yourself.
Note: Do not use class member/global/static variables to store states. Your serialize and deserialize algorithms should be stateless.
转载于 点击打开链接说明:这里为了更方便的存储和恢复,例子中的二叉树采用这样的形式存储[1, 2, null, null,3,4,null, null,5,null,null],即直至所有的叶节点都是null为止。
思路:将一颗树转化成一个字符串存储时,采用的是先序遍历的方法。将字符串转化成树,采用迭代的方式。
/**
* 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:
string NN="null";
string split=",";
// Encodes a tree to a single string.
void pre_order(TreeNode* T, string& s)
{
if(T==NULL)
s.append(NN).append(split);
else
{
stringstream ss;
ss<<T->val;
s.append(ss.str()).append(split);
pre_order(T->left,s);
pre_order(T->right,s);
}
}
string serialize(TreeNode* root) {
string s;
pre_order(root,s);
return s;
}
queue<string> splition(string & data)//将字符串分解
{
int n=data.size();
int idx=0;
queue<string> ans;
for(int i=0;i<n;i++)
{
if(data[i]==',')
{
ans.push(data.substr(idx,i-idx));
idx=i+1;
}
}
return ans;
}
TreeNode* buildTree(queue<string>& str)
{
string s=str.front();
str.pop();
if(s==NN) return NULL;
else
{
int num;
stringstream ss(s);
ss>>num;
TreeNode* T=new TreeNode(num);
T->left=buildTree(str);
T->right=buildTree(str);
return T;
}
}
// Decodes your encoded data to tree.
TreeNode* deserialize(string data) {
queue<string> sq=splition(data);
return buildTree(sq);
}
};
// Your Codec object will be instantiated and called as such:
// Codec codec;
// codec.deserialize(codec.serialize(root));