题解 | #序列化二叉树#

序列化二叉树

https://www.nowcoder.com/practice/cf7e25aa97c04cc1a68c8f040e71fb84

怎么还有这种题啊,我以为只有想不出来思路和秒过两种题,没想到还有这种堆程序的题。。。

看了题解,什么时候我也能写出来这种递归啊,简直美如画😍

class Solution {
  public:
    char* Serialize(TreeNode* root) {
        if (!root) return nullptr;
        vector<TreeNode*> query;
        vector<string> rec;
        query.push_back(root);
        TreeNode* tmp;
        while (!query.empty()) {
            tmp = query[0];
            if (!tmp) rec.push_back("#");
            else rec.push_back(to_string(tmp->val));
            query.erase(query.begin());

            if (tmp) query.push_back(tmp->left);
            if (tmp) query.push_back(tmp->right);
        }
        while (rec.back() == "#") {
            rec.pop_back();
        }
        string ser = "";
        for (int i = 0; i < rec.size(); i++) {
            ser += rec[i];
            ser += ",";
        }
        char* chser = new char[ser.size()];
        strcpy(chser, ser.c_str());
        return chser;
    }
    TreeNode* Deserialize(char* str) {
        if (!str) return nullptr;
        string ser = str, s;
        int pre = 0, tail = 0, num;
        vector<TreeNode*> query;
        TreeNode* tmp, * root, * newtree;
        int judge_pop = -1;
        while (tail < ser.size()) {
            if (ser[tail] == ',') {
                s = ser.substr(pre, tail - pre);
                if (s == "#") judge_pop++;
                else {
                    sscanf(s.c_str(), "%d", &num);
                    if (query.empty()) {
                        root = new TreeNode(num);
                        newtree = root;
                        query.push_back(newtree);
                        judge_pop++;
                    } else {
                        tmp = query[0];
                        newtree = new TreeNode(num);
                        query.push_back(newtree);
                        if (judge_pop == 0) tmp->left = newtree;
                        else if (judge_pop == 1) tmp->right = newtree;
                        judge_pop++;
                    }
                }
                tail++;
                pre = tail;
                if (judge_pop == 2) {
                    query.erase(query.begin());
                    judge_pop = 0;
                }
            } else tail++;
        }
        return root;
    }
};

全部评论

相关推荐

就用这个吧:支持多益再加一个空气使用费
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务