剑指 Offer 37. 序列化二叉树

剑指 Offer 37. 序列化二叉树

题目

请实现两个函数,分别用来序列化和反序列化二叉树。

你需要设计一个算法来实现二叉树的序列化与反序列化。这里不限定你的序列 / 反序列化算法执行逻辑,你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构。

思路

序列化:将二叉树按照先序遍历的方式序列化为字符串,节点之间以逗号隔开,空节点表示为字符串 "NULL"。

反序列化:因为是按照先序遍历进行序列化的,所以序列是按照根节点+左子树+右子树进行排列的,可以通过递归进行处理

注意: 单纯的先序遍历是不能还原二叉树的,在序列化的时候一定要保存空节点!

其他方法:待做。。。

代码

class Codec {
public:
    // Encodes a tree to a single string.
    void encodes(TreeNode* root, string& str) {
        if (root == nullptr) {
            str += "NULL,";
            return;
        }
        str += to_string(root->val) + ",";
        encodes(root->left, str);
        encodes(root->right, str);
    }

    string serialize(TreeNode* root) {
        string ret;
        encodes(root, ret);
        return ret;
    }

    TreeNode* decodes(queue<string>& q) {
        if (q.front() == "NULL") {
            q.pop();
            return nullptr;
        }
        TreeNode* root = new TreeNode(stoi(q.front()));
        q.pop();
        root->left = decodes(q);
        root->right = decodes(q);
        return root;
    }

    // Decodes your encoded data to tree.
    TreeNode* deserialize(string data) {
        string str;
        queue<string> dataQueue;
        for (const auto& ch : data) {
            if (ch == ',') {
                dataQueue.push(str);
                str.clear();
            } else {
                str += ch;
            }
        }
        return decodes(dataQueue);
        
    }
};
posted @ 2022-04-14 16:30  沐灵_hh  阅读(19)  评论(0编辑  收藏  举报