这道题本身挺简单的,但是坑是真的多,给我整破防了。
先说一下大概的思路,直接用层序遍历来序列化。序列化的时候使用一个队列来辅助将结点值拼接到字符串上,节点为空则拼接#。反序列化时同理,使用队列来辅助反序列化,创建好的节点先入队,并且查看队头结点的情况,若其左结点为空,则将该结点设为队头结点的左结点,若队头结点右结点为空,则将该结点设为队头节点右结点,并将队头出队。
在最开始写好时,两个测试用例无事通过,信心满满,点击提交,用例未通过{100,50,##,50},噩梦开始。
因为最初审题不细致,没看到结点取值为0<=val<=100,我默认值是在0-9之间的个位数了。虽然这对整个程序的逻辑框架完全没有影响,但是意味着要添加很大的工作量去处理十位数以及百位数。
因为字符串处理这块确实基础不太牢,同时这块地坑也是真的多,添加多位数处理的时间占了整道题的2/3以上,期间我真是被整的多次破防。最后专门写了个函数来处理。
空间复杂度方面,最多用到一维数组,无递归,空间复杂为O(n)。时间复杂度方面,涉及到循环遍历,基本逻辑仅用到一重循环,在字符串处理时用到了一个嵌套的二重循环,不过并不是完全嵌套,仅是轻度嵌套,时间复杂度比O(n)稍大。

ps: 题目里面给你带点字符串处理的这种题做多了真的折寿。

/*
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 nullptr;
        }
        queue<TreeNode*> qe;
        qe.push(root);
        TreeNode* p = root;
        string s;
        while(qe.size() > 0){
            if(!qe.front()){
                s += "#,";
                qe.pop();
                continue;
            }
            TreeNode* temp = qe.front();
            qe.pop();
            s += to_string(temp->val);
            s += ',';
            qe.push(temp->left);
            qe.push(temp->right);
        }
        char* c = new char[100];
        strcpy(c,s.data());
        return c;
    }
    TreeNode* Deserialize(char *str) {
        if(!str){
            return nullptr;
        }
        vector<string> s = getNum(str);
        TreeNode* head = new TreeNode(atoi(s[0].c_str()));
        TreeNode* p;
        queue<TreeNode*> qe;
        qe.push(head);
        int i = 1;
        while(i < s.size()){
            bool flag = false;
            if(s[i] == "#"){
                flag = true;
            }
            if(!flag){
                p = new TreeNode(atoi(s[i].c_str()));
                qe.push(p);
            }
            i++;
            if(qe.front()->left && !flag){
                qe.front()->right = p;
                qe.pop();
            }
            else if(!flag){
                qe.front()->left = p;
            }
            else{
                if(qe.front()->left){
                    qe.pop();
                }
                else{
                    if(s[i] == "#"){
                        qe.pop();
                        i++;
                    }
                    else{
                        TreeNode* np = new TreeNode(atoi(s[i].c_str()));
                        qe.push(np);
                        qe.front()->right = np;
                        qe.pop();
                        i++;
                    }
                }
            }
        }
        return head;
    }
    vector<string> getNum(char* c){
        vector<string> s;
        string temp = "";
        string origin(c);
        int i = 0;
        while(c[i]){
            if(c[i] == '#'){
                s.push_back("#");
                i += 2;
            }
            else{
                int j = i+1;
                while(c[j]){
                    if(c[j] == ','){
                        break;
                    }
                    j++;
                }
                string sub = origin.substr(i,j-i);
                s.push_back(sub);
                i = j + 1;
            }
        }
        return s;
    }
};