剑指offer 38. 序列化二叉树

简介: 剑指offer 38. 序列化二叉树

题目描述

您需要确保二叉树可以序列化为字符串,并且可以将此字符串反序列化为原始树结构。

数据范围

树中节点数量 [0,1000]。



样例

你可以序列化如下的二叉树
   8
  / \
 12  2
 / \
6   4
为:"[8, 12, 2, null, null, 6, 4, null, null, null, null]"


注意:

  • 以上的格式是AcWing序列化二叉树的方式,你不必一定按照此格式,所以可以设计出一些新的构造方式。


方法一:dfs O(n)

我们可以通过前序遍历来序列化和反序列化。

序列化:


  1. 如果当前遍历的结点为空,则往 res 后加 '#'
  2. 如果当前遍历的结点不为空,则将当前结点的值转换成字符串加到 res 后面,同样也要加空格。
  3. 分别遍历结点的左右子树,进行上述相同操作。



反序列化:


如果此时已经遍历到 data 的最后,则结束遍历。

获取 data 的第一串字符。

如果第一串字符为 # ,则说明该结点为空,直接返回 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 Solution {
public:
    // Encodes a tree to a single string.
    string serialize(TreeNode* root) {
        string res = "";
        dfs_s(root, res);
        return res;
    }
    void dfs_s(TreeNode* root, string& res) {
        if (!root) {
            res += "# ";  //空结点用#来表示
            return;
        }
        //利用前序遍历来生成字符串
        res += to_string(root->val) + ' ';  //同样在后面要加一个空格方便反序列化判断
        dfs_s(root->left, res);
        dfs_s(root->right, res);
    }
    // Decodes your encoded data to tree.
    TreeNode* deserialize(string data) {
        int u = 0;
        return dfs_d(data, u);
    }
    TreeNode* dfs_d(string data, int& u) {
        if (u == data.size())  return NULL;
        int k = u;
        while (data[k] != ' ')   k++;  //先截取出序列中的一串字符
        //如果是井号说明是空结点,则直接返回
        if (data[u] == '#') {
            u = k + 1;  //找到下一串字符的首部
            return NULL;
        }
        //判断数字的正负号
        int num = 0;
        if (data[u] == '-') {
            for (int i = u + 1; i < k; i++)
                num = num * 10 + data[i] - '0';
            num *= -1;
        }
        else {
            for (int i = u; i < k; i++)
                num = num * 10 + data[i] - '0';
        }
        u = k + 1;  //找到下一串字符的首部
        TreeNode* root = new TreeNode(num);   //创建结点
        root->left = dfs_d(data, u);
        root->right = dfs_d(data, u);
        return root;
    }
};

欢迎大家在评论区交流~

目录
相关文章
|
6月前
|
Go
golang力扣leetcode 297.二叉树的序列化与反序列化
golang力扣leetcode 297.二叉树的序列化与反序列化
40 0
|
6月前
|
存储 算法 C++
leetcode-297:二叉树的序列化与反序列化
leetcode-297:二叉树的序列化与反序列化
44 1
|
3月前
|
存储 算法 Python
【Leetcode刷题Python】297. 二叉树的序列化与反序列化
LeetCode第297题"二叉树的序列化与反序列化"的Python语言解决方案,包括序列化二叉树为字符串和反序列化字符串为二叉树的算法实现。
25 5
|
6月前
|
Java Go 算法
Golang每日一练(leetDay0100) 二叉树序列化和反序列化
Golang每日一练(leetDay0100) 二叉树序列化和反序列化
54 0
Golang每日一练(leetDay0100) 二叉树序列化和反序列化
|
6月前
|
Go Python 算法
Python每日一练(20230412) 队列实现栈、二叉树序列化、交换链表节点
Python每日一练(20230412) 队列实现栈、二叉树序列化、交换链表节点
767 0
Python每日一练(20230412) 队列实现栈、二叉树序列化、交换链表节点
|
6月前
|
算法 前端开发
331. 验证二叉树的前序序列化
331. 验证二叉树的前序序列化
48 0
|
6月前
|
算法
剑指 Offer 37:序列化二叉树
剑指 Offer 37:序列化二叉树
41 0
|
10天前
|
JSON 数据格式 索引
Python中序列化/反序列化JSON格式的数据
【11月更文挑战第4天】本文介绍了 Python 中使用 `json` 模块进行序列化和反序列化的操作。序列化是指将 Python 对象(如字典、列表)转换为 JSON 字符串,主要使用 `json.dumps` 方法。示例包括基本的字典和列表序列化,以及自定义类的序列化。反序列化则是将 JSON 字符串转换回 Python 对象,使用 `json.loads` 方法。文中还提供了具体的代码示例,展示了如何处理不同类型的 Python 对象。
|
20天前
|
存储 安全 Java
Java编程中的对象序列化与反序列化
【10月更文挑战第22天】在Java的世界里,对象序列化和反序列化是数据持久化和网络传输的关键技术。本文将带你了解如何在Java中实现对象的序列化与反序列化,并探讨其背后的原理。通过实际代码示例,我们将一步步展示如何将复杂数据结构转换为字节流,以及如何将这些字节流还原为Java对象。文章还将讨论在使用序列化时应注意的安全性问题,以确保你的应用程序既高效又安全。
|
1月前
|
存储 Java
Java编程中的对象序列化与反序列化
【10月更文挑战第9天】在Java的世界里,对象序列化是连接数据持久化与网络通信的桥梁。本文将深入探讨Java对象序列化的机制、实践方法及反序列化过程,通过代码示例揭示其背后的原理。从基础概念到高级应用,我们将一步步揭开序列化技术的神秘面纱,让读者能够掌握这一强大工具,以应对数据存储和传输的挑战。