297. Serialize and Deserialize Binary Tree

这篇博客探讨了如何对二叉树进行序列化和反序列化,包括深度优先的前序遍历方法(用'#'表示NULL节点)和广度优先的层次遍历方法。在没有二叉搜索树的大小关系辅助下,需要额外存储信息来恢复树结构。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这题是更general一些的二叉树serialization和deserialization,没有了BST里面的大小关系可以依赖,所以需要额外的存储,一种思路是生成两个序列,比如preorder和inorder,一种是存储NULL节点,是得我们可以按顺序或者按数量来以此恢复。因为NULL节点的大小普遍小于真实的node value,或者说存储更方便(任意指定符合即可),所以后者是我们主要使用的方法。

方法一:preorder 深度优先
我们用’#'表示NULL

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Codec {
public:

    // Encodes a tree to a single string.
    string serialize(TreeNode* root) {
        string res;
        serialize_helper(root, res);
        return res;
    }
    void serialize_helper(TreeNode* root, string &res) {
        if (!root) {
            res += "# ";
            return;
        }
        else {
            res += to_string(root->val) + ' ';
            serialize_helper(root->left, res);
            serialize_helper(root->right, res);
            return;
        }
    }

    // Decodes your encoded data to tree.
    TreeNode* deserialize(string data) {
        TreeNode* root;
        int i = 0;
        deserialize_helper(root, data, i);
        return root;
    }
    void deserialize_helper(TreeNode* &root, string &data, int &i) {
        if (i >= data.size() - 1) return;
        if (data[i] == ' ') i++;
        if (data[i] == '#') {
            root = NULL;
            i++;
            return;
        }
        string curr;
        while (data[i] != ' ') curr += data[i++];
        root = new TreeNode(stoi(curr));
        deserialize_helper(root->left, data, i);
        deserialize_helper(root->right, data, i);
        return;
    }
};

当然,这里也可以首先把传递的data一次性解析读进数组里,然后依次recursive处理。

方法二:level order 广度优先

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Codec {
public:

    // Encodes a tree to a single string.
    string serialize(TreeNode* root) {
        string res;
        if (!root) return res;
        queue<TreeNode*> q;
        q.push(root);
        while (!q.empty()) {
            TreeNode* curr = q.front();
            q.pop();
            if (curr) {
                res += to_string(curr->val) + ' ';
                q.push(curr->left);
                q.push(curr->right);
            }
            else {
                res += "# ";
            }
        }
        return res;
    }

    // Decodes your encoded data to tree.
    TreeNode* deserialize(string data) {
        if (data.size() == 0) return NULL;
        int i = 0;
        string curr;
        while (data[i] != ' ') curr += data[i++];
        TreeNode* root = new TreeNode(stoi(curr));
        queue<TreeNode*> q;
        q.push(root);
        while (!q.empty()) {
            TreeNode* t = q.front();
            q.pop();
            // left child
            if (data[i] == ' ') i++;
            if (data[i] == '#') {
                t->left = NULL;
                i++;
            }
            else {
                curr.clear();
                while (data[i] != ' ') curr+= data[i++];
                TreeNode* left = new TreeNode(stoi(curr));
                t->left = left;
                q.push(left);
            }
            // right child
            if (data[i] == ' ') i++;
            if (data[i] == '#') {
                t->right = NULL;
                i++;
            }
            else {
                curr.clear();
                while (data[i] != ' ') curr+= data[i++];
                TreeNode* right = new TreeNode(stoi(curr));
                t->right = right;
                q.push(right);
            }
        }
        return root;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值