请实现两个函数,分别用来序列化和反序列化二叉树。
思路:主要是区分空节点,val之间用特殊符号隔开,例如用 ‘-’表示节点分隔符,当遇到空节点时用#表示,按层遍历即可,当然也可以用其他遍历方式 。磕磕绊绊也算是AC了。
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};
*/
class Solution {
public:
char* Serialize(TreeNode *root)
{
string str="";
stringstream st;
if(root==NULL)
return "";
queue
que;
que.push(root);
TreeNode *p;
st<
val;
str+="-"+st.str();
st.str("");
while(!que.empty())
{
p = que.front();
que.pop();
if(p->left)
{
que.push(p->left);
st<<(p->left->val);
str+="-"+st.str();
st.str("");
}
else
{
str+="-#";
}
if(p->right)
{
que.push(p->right);
st<<(p->right->val);
str+="-"+st.str();
st.str("");
}
else
{
str+="-#";
}
}
char *res = new char [strlen(str.c_str())+1];
strcpy(res,str.c_str());
return res;
}
TreeNode* Deserialize(char *str)
{
if(strlen(str)==0)
return NULL;
int count = strlen(str);
int i=1,pre=0,next=0;
int sum =0;
queue
que;
while(str[i]!='-'&&str[i]!='#')
{
sum=sum*10+(str[i]-'0');
i++;
}
i++;
TreeNode *root = new TreeNode(sum);
TreeNode *p;
que.push(root);
while(!que.empty()&&i
left=NULL;
i=i+2;
}
else
{
sum =0;
while(str[i]!='-')
{
sum=sum*10+(str[i]-'0');
i++;
}
TreeNode *node = new TreeNode(sum);
p->left = node;
que.push(node);
i++;
}
if(str[i]=='#')
{
p->right = NULL;
i=i+2;
}
else
{
sum =0;
while(str[i]!='-')
{
sum=sum*10+(str[i]-'0');
i++;
}
TreeNode *node = new TreeNode(sum);
p->right = node;
que.push(node);
i++;
}
}
return root;
}
};