题解 | #序列化二叉树#
序列化二叉树
http://www.nowcoder.com/practice/cf7e25aa97c04cc1a68c8f040e71fb84
这个题虽然官方说很简单,两颗星,实现的代码看起来也简单。
难点在下面个地方:
1.中序跟后序遍历实现起来非常麻烦,我现在还不会。
2.先序遍历解码是时候需要注意是指针引用。因为只有指针引用才能保证每次方法调用的是同一个指针。
3.需要注意序列化的时候加入分隔符,非常关键。在反序列化的时候作为数值分隔的标志。
/*
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) {
if (!root) {
return "#";
}
string res = to_string(root->val);
res.push_back(',');
string left = Serialize(root->left);
string right = Serialize(root->right);
res = res + left + right;
char *ret = new char[res.length()];
strcpy(ret, res.c_str());
return ret;
}
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;
}
TreeNode* Deserialize(char *str) {
return deseri(str);
}
};
