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