题目:
请实现两个函数,分别用来序列化和反序列化二叉树
思路:
类似于层序遍历,以“,”分隔,以“#”代表空
代码:
class Solution {
public:
char* Serialize(TreeNode *root)
{
string strTmp;
queue<TreeNode*> que;
que.push(root);
while(!que.empty())
{
TreeNode *pTmp = que.front();
que.pop();
if(NULL == pTmp)
strTmp.append("#,");
else
{
strTmp.append(toString(pTmp->val)).append(",");
que.push(pTmp->left);
que.push(pTmp->right);
}
}
int length = strTmp.size();
char *strRes = new char[length + 1];
memcpy(strRes, strTmp.c_str(), strTmp.size());
strRes[length] = '\0';
return strRes;
}
TreeNode* Deserialize(char *str)
{
if (0 == strlen(str) || *str == '#')
return NULL;
int num = 0;
FindOneNum(str, num);
TreeNode *pRoot = new TreeNode(num);
queue<TreeNode*> que;
que.push(pRoot);
while(!que.empty())
{
TreeNode * tmp = que.front();
que.pop();
if(FindOneNum(str, num))
{
tmp->left = new TreeNode(num);
que.push(tmp->left);
}
if(FindOneNum(str, num))
{
tmp->right = new TreeNode(num);
que.push(tmp->right);
}
}
return pRoot;
}
bool FindOneNum(char *&str, int &Num)
{
if('#' == *str)
{
str += 2;
return false;
}
Num = 0;
for(;*str != ','; ++str)
{
Num = Num*10 + (*str - '0');
}
++str;
return true;
}
string toString(int t)
{
ostringstream oss;
oss<<t;
return oss.str();
}
};