题解 | #序列化二叉树#
序列化二叉树
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的解析结合