这个题虽然官方说很简单,两颗星,实现的代码看起来也简单。
难点在下面个地方:
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); } };