题解 | #序列化二叉树#

序列化二叉树

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

必须返回char*的接口

/*
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 == nullptr) return nullptr;
        string str;
        queue<TreeNode*> q; // bfs
        q.push(root);
        while (!q.empty()) {
            int size = q.size();
            for (int i = 0; i < size; ++i) {
                auto node = q.front();
                q.pop();
                if (node != nullptr) {
                    str += to_string(node->val) + ","; // 加,是为了区分开节点值
                    q.push(node->left); // 左子树是null也入队
                    q.push(node->right);
                } else {
                    str += "#";
                }
            }
        }
        auto res = new char[str.length() + 1];
        strcpy(res, str.c_str());
        res[str.length()] = '\0';      
        return res; 
    }
    TreeNode* Deserialize(char *str) {
        if (str == nullptr) return nullptr;
        int k = 0;
        queue<TreeNode*> q;
        auto root = new TreeNode(getvalue(str, k));
        q.push(root);
        while (!q.empty()) {
            int size = q.size();
            for (int i = 0; i < size; ++i) {
                auto node = q.front();
                q.pop();
                int l = getvalue(str, k);
                if (l != -1) {
                    auto node_l = new TreeNode(l);
                    node->left = node_l;
                    q.push(node_l); 
                }
                int r = getvalue(str, k);
                if (r != -1) {
                    auto node_r = new TreeNode(r);
                    node->right = node_r;
                    q.push(node_r); 
                }
            }
        }
        return root;
    }

    int getvalue(char* str, int &k) {
        int val = 0;
        while (str[k] != ',' && str[k] != '\0' && str[k] != '#') {
            val = val * 10 + str[k] - '0';
            k++;
        }
        if (str[k] == '\0') return -1;
        if (str[k] == '#') val = -1;
        k++;
        return val;
    }


};

leetcode

class Codec {
public:
    // [1,2,3,null,null,4,5]
    /*
        res == 2,#,#
        res == 4,#,#
        res == 5,#,#
        res == 3,4,#,#,5,#,#
        res == 1,2,#,#,3,4,#,#,5,#,#
    */
    string serialize(TreeNode* root) {
        if (root == nullptr) return "#";
        string res = to_string(root->val);
        res += "," + serialize(root->left);
        res += "," + serialize(root->right);
        cout << "res == " << res << endl;
        return res;
    }
    string m_data;
    int m_index = 0;
    TreeNode* dfs_rebuild() {
        if (m_data[m_index] == '#') {
            m_index += 2;
            return nullptr;
        }
        TreeNode* root = new TreeNode(-1);
        int sum = 0;
        int j = m_index;
        // [0,9]保证了一个节点的值不会被序列化时候的,造成影响
        while (j < m_data.size() && m_data[j] >= '0' && m_data[j] <= '9') {
            sum = sum * 10 + (m_data[j] - '0');
            j++;
        }
        m_index = j+1;
        root->val = sum;
        root->left = dfs_rebuild();
        root->right = dfs_rebuild();
        return root;
    }
   
    TreeNode* deserialize(string data) {
        m_data = data;
        return dfs_rebuild();
    }
};

2023-剑指-二叉树 文章被收录于专栏

2023-剑指-二叉树

全部评论

相关推荐

03-01 19:30
已编辑
南京大学 Java
点赞 评论 收藏
分享
03-12 15:35
嘉应学院 Python
快说谢谢牛牛精灵:说不定就是下一个寒武纪!
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
正在热议
更多
# 长得好看会提高面试通过率吗? #
3136次浏览 43人参与
# HR最不可信的一句话是__ #
1014次浏览 32人参与
# 米连集团26产品管培生项目 #
7062次浏览 224人参与
# 春招至今,你的战绩如何? #
14766次浏览 137人参与
# AI面会问哪些问题? #
890次浏览 22人参与
# 你的实习产出是真实的还是包装的? #
2704次浏览 52人参与
# 巨人网络春招 #
11484次浏览 224人参与
# 沪漂/北漂你觉得哪个更苦? #
1209次浏览 38人参与
# 你做过最难的笔试是哪家公司 #
1123次浏览 20人参与
# AI时代,哪个岗位还有“活路” #
2675次浏览 49人参与
# XX请雇我工作 #
51147次浏览 171人参与
# 军工所铁饭碗 vs 互联网高薪资,你会选谁 #
7965次浏览 43人参与
# 简历第一个项目做什么 #
32067次浏览 357人参与
# 简历中的项目经历要怎么写? #
310896次浏览 4257人参与
# 不考虑薪资和职业,你最想做什么工作呢? #
152823次浏览 888人参与
# 当下环境,你会继续卷互联网,还是看其他行业机会 #
187553次浏览 1123人参与
# AI时代,哪些岗位最容易被淘汰 #
64520次浏览 864人参与
# 如果重来一次你还会读研吗 #
229971次浏览 2011人参与
# 投格力的你,拿到offer了吗? #
178239次浏览 891人参与
# 你怎么看待AI面试 #
180643次浏览 1295人参与
# 正在春招的你,也参与了去年秋招吗? #
364158次浏览 2641人参与
# 腾讯音乐求职进展汇总 #
160820次浏览 1114人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务