题目传送门
题解
- 首先考虑写先序遍历。
- 遇到
NULL 写入
"#"
- 遇到非空,写入
"i,"
- 细节见代码
- 考虑中序、后序遍历:
- 对于这样一棵树
4
2 6
1 3 5 7
- 在先序的时候,我们每次先访问根,然后才是左和右,这样没什么毛病
- 但是中序、后序的时候,就会出现问题
- 按照这个数,我们序列化之后,一定是 # 开头,那么就需要很多的特判来避免歧义,比较复杂。
- 所以最好使用先序遍历序列化
AC-Code
class Solution {
public:
char* Serialize(TreeNode* root) {
if (!root) {
return (char*)"#";
}
char* left = Serialize(root->left);
string res = to_string(root->val);
res.push_back(',');
char* right = Serialize(root->right);
char* ret = new char[strlen(left) + strlen(right) + res.size()];
strcpy(ret, res.c_str());
strcat(ret, left);
strcat(ret, right);
return ret;
}
TreeNode* Deserialize(char* str) {
return deseri(str);
}
private:
TreeNode* deseri(char*& s) {
if (*s == '#') {
++s;
return nullptr;
}
int num = 0;
while (*s != ',') {
num = num * 10 + (*s - '0');
++s;
}
++s;
TreeNode* root = new TreeNode(num);
root->left = deseri(s);
root->right = deseri(s);
return root;
}
};