• 297. 二叉树的序列化与反序列化


    题目描述

    序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据。

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

    提示: 输入输出格式与 LeetCode 目前使用的方式一致,详情请参阅 LeetCode 序列化二叉树的格式。你并非必须采取这种方式,你也可以采用其他的方法解决这个问题。

    示例 1:

    在这里插入图片描述

    输入:root = [1,2,3,null,null,4,5]
    输出:[1,2,3,null,null,4,5]
    
    • 1
    • 2

    示例 2:

    输入:root = []
    输出:[]
    
    • 1
    • 2

    示例 3:

    输入:root = [1]
    输出:[1]
    
    • 1
    • 2

    示例 4:

    输入:root = [1,2]
    输出:[1,2]
    
    • 1
    • 2

    提示:

    • 树中结点数在范围 [0, 104]
    • -1000 <= Node.val <= 1000

    解答

    /**
     * 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) {
            // 自定义序列化格式:
            // nullptr 用 # 表示
            // 用 _ 做分隔
            if(root == nullptr) return "#_";
    
            string res = to_string(root->val) + "_";
            res += serialize(root->left);
            res += serialize(root->right);
            return res;
        }
    
        // Decodes your encoded data to tree.
        TreeNode* deserialize(string data) {
            istringstream ss(data);
            string item;
            queue<string> q;
    
            // 从ss中以 '_' 为分隔符读取每个单词,分隔符不读入item中
            while(getline(ss, item, '_'))
            {
                q.push(item);
            }
            // 根据层序进行还原
            return helper(q);
        }
    
        TreeNode *helper(queue<string> &q)
        {
            string val = q.front();
            q.pop();
            if(val == "#") return nullptr;
            TreeNode *root = new TreeNode(stoi(val));
            root->left = helper(q);
            root->right = helper(q);
            return root;
        }
    };
    
    // Your Codec object will be instantiated and called as such:
    // Codec ser, deser;
    // TreeNode* ans = deser.deserialize(ser.serialize(root));
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
  • 相关阅读:
    数字滤波器分析---零极点分析
    基于单片机设计的气压与海拔高度检测计(采用MPL3115A2芯片实现)
    4年软件测试工作经验,跳槽之后面试20余家公司的总结
    Mac版2024 CleanMyMac X 4.14.6 核心功能详解
    合并两个有序数组
    使用VirtualLab Fusion仿真多层双折射反射偏振器
    webpack和vite的区别
    AUTOSAR规范与ECU软件开发(实践篇)10、AUTOSAR技术展望
    文件编辑器、用户管理,嘎嘎学
    动态调试python源码的步骤与案例
  • 原文地址:https://blog.csdn.net/qq_42120843/article/details/132689646