您的位置:首页 > Web前端

剑指offer 序列化二叉树

2017-02-22 23:12 387 查看
请实现两个函数,分别用来序列化和反序列化二叉树。

思路:主要是区分空节点,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 "";
queueque;
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;
queueque;
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()&&ileft=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;

}

};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: