题解 | #序列化二叉树#
序列化二叉树
http://www.nowcoder.com/practice/cf7e25aa97c04cc1a68c8f040e71fb84
- 注意用nullptr来代替真正的空指针,因为NULL就是0,虽然绝大多数情况下没问题,但是这个题就会出问题。
- 记得用to_string来转化数字,在数字位数大于1位时候。
- 转过来的时候用atoi(s.c_str());因为位数可能大于1;
- atoi 会自动遇到,停止。
- 注意char* 转 string以及 string 转 char* 的方式
- char*也可以取[]正常访问。
- 也是BFS解决树的构建问题。
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};
*/
class Solution {
public:
string res="";
char* Serialize(TreeNode *root) {
queue<TreeNode *> q;
q.push(root);
while(!q.empty()){
TreeNode* node = q.front();
q.pop();
//只有这样写,才是后序遍历
if(node==nullptr){
res+='#';
res+=',';
continue;
}
res+= to_string(node->val);
res+=',';
q.push(node->left);
q.push(node->right);
}
//转换成string
char* c = new char[res.length()+1];
strcpy(c,res.c_str());
return c;
}
TreeNode* Deserialize(char *str) {
if(str==nullptr){
return nullptr;
}
if(str[0]=='#'){
return nullptr;
}
string s(str);//char* 这个函数char* 直接转 string
queue<TreeNode*> nodes;
TreeNode* root = new TreeNode(atoi(s.c_str()));//建立根节点//且可以直接截止到,之前的数字
s = s.substr(s.find_first_of(',')+1);//下一个节点
nodes.push(root);
while(!nodes.empty()&&!s.empty()){
TreeNode* node = nodes.front();
nodes.pop();
if(s[0]=='#'){
node->left = nullptr;//要改成这个。
s = s.substr(2);//从下一个数开始
}else{
node->left = new TreeNode(atoi(s.c_str()));
nodes.push(node->left);
s = s.substr(s.find_first_of(',')+1);
}
if(s[0]=='#'){
node->right = nullptr;//要改成这个。
s = s.substr(2);//从下一个数开始
}else{
node->right = new TreeNode(atoi(s.c_str()));
nodes.push(node->right);
s = s.substr(s.find_first_of(',')+1);
}
}
return root;
}
};剑指Offer 文章被收录于专栏
剑指offer的解析结合
三奇智元机器人科技有限公司公司福利 50人发布