LeetCode 428. Serialize and Deserialize N-ary Tree【树,BFS,DFS】困难

news/2024/7/20 21:55:50 标签: leetcode, 宽度优先, 深度优先

本文属于「征服LeetCode」系列文章之一,这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁,本系列将至少持续到刷完所有无锁题之日为止;由于LeetCode还在不断地创建新题,本系列的终止日期可能是永远。在这一系列刷题文章中,我不仅会讲解多种解题思路及其优化,还会用多种编程语言实现题解,涉及到通用解法时更将归纳总结出相应的算法模板。

为了方便在PC上运行调试、分享代码文件,我还建立了相关的仓库:https://github.com/memcpy0/LeetCode-Conquest。在这一仓库中,你不仅可以看到LeetCode原题链接、题解代码、题解文章链接、同类题目归纳、通用解法总结等,还可以看到原题出现频率和相关企业等重要信息。如果有其他优选题解,还可以一同分享给他人。

由于本系列文章的内容随时可能发生更新变动,欢迎关注和收藏征服LeetCode系列文章目录一文以作备忘。

序列化是指将一个数据结构转化为位序列的过程,因此可以将其存储在文件中或内存缓冲区中,以便稍后在相同或不同的计算机环境中恢复结构。

设计一个序列化和反序列化 N N N 叉树的算法。一个 N N N 叉树是指每个节点都有不超过 N N N 个孩子节点的有根树。序列化 / 反序列化算法的算法实现没有限制。你只需要保证 N N N 叉树可以被序列化为一个字符串并且该字符串可以被反序列化成原树结构即可。

例如,你需要序列化下面的 3-叉 树。

为 [1 [3[5 6] 2 4]]。你不需要以这种形式完成,你可以自己创造和实现不同的方法。

或者,您可以遵循 LeetCode 的层序遍历序列化格式,其中每组孩子节点由空值分隔

例如,上面的树可以序列化为 [1,null,2,3,4,5,null,null,6,7,null,8,null,9,10,null,null,11,null,12,null,13,null,null,14]

你不一定要遵循以上建议的格式,有很多不同的格式,所以请发挥创造力,想出不同的方法来完成本题。

示例 1:

输入: root = [1,null,2,3,4,5,null,null,6,7,null,8,null,9,10,null,null,11,null,12,null,13,null,null,14]
输出: [1,null,2,3,4,5,null,null,6,7,null,8,null,9,10,null,null,11,null,12,null,13,null,null,14]

示例 2:

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

示例 3:

输入: root = []
输出: []

提示:

  • 树中节点数目的范围是 [0, 10^4].
  • 0 <= Node.val <= 10^4
  • N N N 叉树的高度小于等于 1000
  • 不要使用类成员 / 全局变量 / 静态变量来存储状态。你的序列化和反序列化算法应是无状态的

类似题目:

  • 449. 序列化和反序列化二叉搜索树
  • 297. 二叉树的序列化与反序列化 困难
  • 428. 序列化和反序列化 N 叉树 困难

解法 BFS+类似LeetCode层序遍历格式+StringJoiner

import java.util.StringJoiner;
class Codec {
    // Encodes a tree to a single string.
    public String serialize(Node root) {
        if (root == null) return "";
        StringJoiner sj = new StringJoiner(",");
        Deque<Node> queue = new ArrayDeque<>();
        queue.offer(root);
        sj.add(Integer.toString(root.val));
        sj.add(null);
        while (!queue.isEmpty()) {
            Node curr = queue.poll();
            for (Node node : curr.children) { // 将每个节点的子节点作为一组,由空值分隔
                sj.add(Integer.toString(node.val));
                queue.offer(node);
            }
            sj.add(null);
        }
        return sj.toString();
    }
	
    // Decodes your encoded data to tree.
    public Node deserialize(String data) {
        if (data.isEmpty()) return null;
        String[] tokens = data.split(",");
        Deque<Node> queue = new ArrayDeque<>();
        int index = 0;
        Node root = new Node(Integer.parseInt(tokens[index++]), new ArrayList<Node>());
        ++index; // 跳过null

        queue.offer(root); 
        while (!queue.isEmpty()) {
            Node curr = queue.poll();
            while (index < tokens.length) {
                if (tokens[index].equals("null")) {
                    ++index;
                    break;
                }
                Node node = new Node(Integer.parseInt(tokens[index++]), new ArrayList<Node>());
                curr.children.add(node);
                queue.offer(node);
            }
        }
        return root;
    }
}

复杂度分析:

  • 时间复杂度: O ( n ) O(n) O(n)
  • 空间复杂度: O ( n ) O(n) O(n)

当然,也可以选择类似JSON那样有层次的序列化格式。总之,序列化和反序列的题目很发散,各种解法都行。


http://www.niftyadmin.cn/n/5022084.html

相关文章

C++ 中的原子变量(std::atomic)使用指南

目录 C 中的原子变量&#xff08;std::atomic&#xff09;使用指南基本概念使用方法创建原子变量读取值修改值原子操作 常见应用场景1. 计数器2. 控制标志3. 链表和数据结构 示例代码结论 C 中的原子变量&#xff08;std::atomic&#xff09;使用指南 原子变量&#xff08;std…

初识Java 8-1 接口和抽象类

目录 抽象类和抽象方法 接口定义 默认方法 多重继承 接口中的静态方法 作为接口的Instrument 本笔记参考自&#xff1a; 《On Java 中文版》 接口和抽象类提供了一种更加结构化的方式分离接口和实现。 抽象类和抽象方法 抽象类&#xff0c;其介于普通类和接口之间。在构…

Zabbix监控平台环境部署

Zabbix监控平台环境部署 1.Linux环境部署 hostnamectl set-hostname zabbix_server #修改主机名方便查看 hostnamectl set-hostname zabbix_agent ​ systemctl stop firewalld #关闭防火墙 systemctl disable firewalld #关闭防火墙开机自启 setenforce 0 #关闭SElinu…

保姆级--scratch连接wedo2.0超详细教程(附资源)

一. 系统和软件版本 1. Windows10 2. 蓝牙 3. Scratch 3.24.0 3.24.0是scratch版本号,scratch打开后左上角显示的就是它的版本号。 4. ScratchLink 1.3.66 1.3.66是ScratchLink的版本号&#xff0c;运行起来后鼠标单击会显示出来 5. …

解决huggingface 在代码因为网络无法下载模型和数据集的问题(伪)

huggingface的模型下载 其实是用git手动下载 具体的方法&#xff1a; sudo apt-get update sudo apt-get install git-lfs git lfs install 然后git clone https://huggingface.co/roberta-large huggingface数据集下载 首先有些数据集也可以通过git下载&#xff08;那种&…

(1)数据库 MSQ 数据库 安装 使用 以及增删改查

下载官网&#xff1a;MySQL :: Download MySQL Shell 常见的数据库分为&#xff1a; 关系型数据库&#xff0c; Oracle、MySQL、SQLServer、Access非关系型数据库&#xff0c; MongoDB、Redis、Solr、ElasticSearch、Hive、HBase 安装过程 使用过程

Python中的def函数

概念&#xff1a; Python中的def语句用于定义一个函数。函数是一个代码块&#xff0c;它可以被重复调用&#xff0c;并且可以接收输入参数和返回值。在Python中&#xff0c;函数是由def关键字、函数名和圆括号内的参数列表组成的。 场景&#xff1a; 以下是几个函数使用场景…

医院院检验科LIS系统源码 检验申请、标本编号、联机采集、报告单的生成与打印、质控图的绘制和数据的检索与备份

一套符合医院院检验科实际需要的管理系统, 实现检验业务全流程的计算机管理。从检验申请、标本编号、联机采集、中文报告单的生成与打印、质控图的绘制和数据的检索与备份。通过将所有仪器自身提供的端口与科室LIS系统中的工作站点连接,实现与医院HIS系统的联网。 通过门诊医生…