BM39-序列化二叉树

news2024/11/25 20:52:36

题目

请实现两个函数,分别用来序列化和反序列化二叉树,不对序列化之后的字符串进行约束,但要求能够根据序列化之后的字符串重新构造出一棵与原二叉树相同的树。

二叉树的序列化(Serialize)是指:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字符串,从而使得内存中建立起来的二叉树可以持久保存。序列化可以基于先序、中序、后序、层序的二叉树等遍历方式来进行修改,序列化的结果是一个字符串,序列化时通过某种符号表示空节点(#)。

二叉树的反序列化(Deserialize)是指:根据某种遍历顺序得到的序列化字符串结果str,重构二叉树。

例如,可以根据层序遍历的方案序列化,如下图:

层序序列化(即用函数Serialize转化)如上的二叉树转为"{1,2,3,#,#,6,7}",再能够调用反序列化(Deserialize)将"{1,2,3,#,#,6,7}"构造成如上的二叉树。

当然你也可以根据满二叉树结点位置的标号规律来序列化,还可以根据先序遍历和中序遍历的结果来序列化。不对序列化之后的字符串进行约束,所以欢迎各种奇思妙想。

数据范围:节点数 n≤100n≤100,树上每个节点的值满足 0≤val≤1500≤val≤150

要求:序列化和反序列化都是空间复杂度 O(n),时间复杂度 O(n)。

示例1

输入:{1,2,3,#,#,6,7}

返回值:{1,2,3,#,#,6,7}

说明:如题面图

示例2

输入:{8,6,10,5,7,9,11}

返回值:{8,6,10,5,7,9,11}


思路

序列化 Serialize :

借助队列,对二叉树做层序遍历,并将越过叶节点的 # 也打印出来。

  • 特例处理: 若 root 为空,则直接返回空字符串 " " ;
  • 初始化: 序列化字符串build;队列 queue (根节点 root 先入队);
  • 层序遍历: 当 queue 为空时跳出;
  1. 节点出队,记为 t ;
  2. 若 t 不为空:① 将 t 的左、右子节点入队,② 添加字符 t.val;
  3. 否则(若 t 为空):添加 "#" ;
  • 返回值: build.toString();

反序列化 Deserialize :

利用队列按层构建二叉树,借助一个指针 i 指向节点 t 的左、右子节点,每构建一个 t 的左、右子节点,指针 i 就向右移动 1 位。

  • 特例处理: 若 str 为空,直接返回 #;
  • 初始化: 序列化字符串数组 s(用逗号隔开);队列 queue(包含 root );根节点 root (值为 s[0] );指针 i = 1 ;
  • 按层构建: 当 queue 为空时跳出;
  1. 节点出队,记为 t;
  2. 构建 t 的左子节点:t.left 的值为 s[i] ,并将 t.left 入队;执行 i++;
  3. 构建 t 的右子节点:t.right 的值为 s[i] ,并将 t.right 入队;执行 i++;
  • 返回值: 返回根节点 root 即可;

代码

import java.util.*;
/*
public class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;

    public TreeNode(int val) {
        this.val = val;

    }
}
*/
public class Solution {
    String Serialize(TreeNode root) {
        if (root == null) {
            return "";
        }

        StringBuilder build = new StringBuilder();
        Queue<TreeNode> queue = new LinkedList<>();
        queue.add(root);

        while (!queue.isEmpty()) {
            TreeNode t = queue.poll();
            if (t != null) {
                queue.add(t.left);
                queue.add(t.right);
                build.append(t.val + ",");
            } else {
                build.append("#,");
            }
        }
        return build.toString();
    }

    TreeNode Deserialize(String str) {
        if (str == null || str.length() <= 0) {
            return null;
        }
        String[] s = str.split(",");
        Queue<TreeNode> queue = new LinkedList<>();
        TreeNode root = new TreeNode(Integer.parseInt(s[0]));
        queue.add(root);
        int i = 1;

        while (!queue.isEmpty()) {
            TreeNode t = queue.poll();
            //构建左子节点
            if (!s[i].equals("#")) {
                TreeNode left = new TreeNode(Integer.parseInt(s[i]));
                t.left = left;
                queue.add(left);
            }
            i++;
            //构建右子节点
            if (!s[i].equals("#")) {
                TreeNode right = new TreeNode(Integer.parseInt(s[i]));
                t.right = right;
                queue.add(right);
            }
            i++;
        }
        return root;
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/459887.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

flv怎么转换成mp4?这3种方法总有适合你的

flv怎么转换成mp4&#xff1f;首先我们得知道flv为什么转换成mp4&#xff1f;FLV和MP4都是常用的视频格式&#xff0c;其中FLV格式在以前的一些互联网应用中得到了广泛使用。但随着技术的发展和设备的普及&#xff0c;MP4格式逐渐成为了主流的视频格式。因此&#xff0c;将FLV格…

jQuery 在图片和文字中插入内容(多种情况考虑)

昨天接到一个新的需要&#xff0c;在后台文章编辑器中&#xff0c;每一个文章的正文前面&#xff0c;可以单独添加一个电头字段&#xff0c;但是如果在富文本编辑器中最上面就添加图片的话&#xff0c;图片就会把电头和正文中的文字给隔开。需要做的是获取到电头字段&#xff0…

一款纯Web化免费SQL工具,重新定义数据库管理

SQL Studio是一款由麦聪软件研发的多数据库管理工具&#xff0c;提供Windows、Linux 和 MacOS三种版本的软件包&#xff0c;支持中英文两种语言。SQL Studio是用Java编写的&#xff0c;默认使用 JDK 8进行编译。 下载看这里: [SQLStudio] (http://www.maicongs.com/#/home/web)…

shell脚本function传参的使用

这里直接上操作来说明function 的传参 新建一个脚本 vi 1.sh #!/bin/bash function check_a {echo $2echo $3echo "this is check_a" } function check_b {echo $2echo "this is check_b" } $1 #$1作为选择执行哪个function的参数 执行以下这个脚本传…

测试不够快?试试这招!让pytest多进程/多线程执行测试用例,轻松提升测试效率!

目录&#xff1a;导读 前言&#xff1a; 多进程执行用例之pytest-xdist pytest-xdist分布式测试的原理&#xff1a; pytest-xdist分布式测试的流程&#xff1a; 多线程执行用例之pytest-parallel 常用参数配置 pytest-parallel与pytest-xdist对比说明: 结语 前言&#…

vue修改当前页面query参数

最近在项目中手写分页器&#xff08;为什么手写&#xff0c;因为对分页器样式外观要求比较严苛&#xff09;&#xff0c;遇到一个需求&#xff0c;就是我们在点击分页的时候&#xff0c;再进入详情&#xff0c;之后回退希望能够回到之前的页码值。 解决这个需求&#xff0c;个…

研报精选230425

目录 【行业230425华金证券】电子行业动态分析&#xff1a;23Q1电子板块环比略微下降&#xff0c;半导体设备重仓持股显著上升 【行业230425中泰证券】电力设备与新能源行业周报&#xff1a;特斯拉一季度储能收入高增&#xff0c;宁德时代发布凝胶态电池 【行业230425长城国瑞证…

行业分析| 视频监控——AI自动巡检

随着视频监控的普及&#xff0c;现在很多社区、工地、车间、厂区、超市、商铺、酒店、餐馆等场所都安装了视频监控系统。当安装的视频监控出现故障时&#xff0c;我们该如何进行简单的视频故障识别呢&#xff1f;如果只依靠人工对视频故障识别排查&#xff0c;工作量是相当大的…

动态规划猜法中外部信息简化的相关问题(上)

文章目录 1、Leetcode 312.戳气球&#xff08;困难&#xff09;1.1 题目描述1.2 思路分析1.3 代码实现1.4 启示 2、Leetcode 546.移除盒子&#xff08;困难&#xff09;2.1 题目描述2.2 思路分析2.3 代码实现 3、消除字符3.1 题目描述3.2 思路分析3.3 代码实现 1、Leetcode 312…

ARM buildroot 的引入

一、X210 的 bsp 介绍 1、嵌入式 linux 产品的 bsp 介绍 (1) 大部分的 ARM 架构的 linux 平台的 bsp 的内容和结构都是相似的。 (2) bsp 一般是芯片厂家/板卡厂家提供的。 2、X210 的 linuxQT bsp 整体介绍 (1) tslib_x210_qtopia.tgz 是用来支持 QT 的触摸屏操作的应用层库。…

操作系统笔记——绪论

第一章绪论 1.1 操作系统的基本概念 1.1.1计算机硬件的基本组成 &#xff08;冯 ~诺伊曼模型&#xff09; &#xff0c;由运算器&#xff0c;存储器&#xff0c;控制器&#xff0c;输入设备&#xff0c;输出设备组成。 引入操作系统的目的&#xff1a;提供一个计算机用户与…

【2. 初学ROS,年轻人的第一个Node节点】

【2. 初学ROS&#xff0c;年轻人的第一个Node节点】 1. 工作空间设置2. 创建Package3. 回访依赖包4. 创建Node节点5. 源码编译6. 运行Node节点7. Node节点完善8. 总结 本教程是B站阿杰视频的笔记 视频地址&#xff1a;https://www.bilibili.com/video/BV1nG411V7HW 超声波传感器…

streamx平台部署

一. streamx介绍 StreamPark 总体组件栈架构如下&#xff0c; 由 streampark-core 和 streampark-console 两个大的部分组成 , streampark-console 是一个非常重要的模块, 定位是一个综合实时数据平台&#xff0c;流式数仓平台, 低代码 ( Low Code ), Flink & Spark 任务托…

【PWN刷题__ret2shellcode】[HNCTF 2022 Week1]ret2shellcode

本蒟蒻的ret2shellcode的开篇之作&#xff01; 第一次实战ret2shellcode&#xff0c;该类型的简单题但是也研究了很久! 目录 前言 一、checksec查看二进制文件​ 二、查找后门函数 三、IDA反汇编 bss段 mprotect()函数 四、GDB调试 GDB基本的一些用法 偏移量计算 五…

OpenSearch图搜图、文搜图向量检索最佳实践

一、向量检索介绍 1.1 多模态信息的典型特点-非结构化 信息可以被划分为两大类&#xff1a;当信息能够用数据或统一的结构加以表示&#xff0c;称之为结构化数据&#xff1b;当信息无法用数字或统一的结构表示&#xff0c;称之为非结构化数据。非结构数据与结构化数据相比较而…

Rockchip芯片单板适配OpenHarmony的方法

Rockchip芯片单板适配OpenHarmony的方法 1 整体思路 OpenHarmony是一个上层用户操作系统&#xff0c;在设计上希望兼容不同的底层系统。针对于L2的Linux标准设备&#xff0c;OpenHarmony对Linux、Uboot等底层系统没有太多的依赖&#xff0c;并且在驱动方面&#xff0c;HDF也兼…

蓝桥杯省一经验+考试流程+技巧分享

今年拿了省一&#xff0c;开心&#xff0c;我渡梦酒也可以拿奖奖啦。 我对整体参赛流程还是比较熟悉了&#xff0c;给大家留下一点值得参考的东西~。 这篇纯纯经验和技巧分享&#xff0c;请放心食用~ 目录 考试流程 考试代码怎么提交 考完结束需要做什么 做题小技巧&#xf…

适合学生党的蓝牙耳机品牌有哪些?性价比高的无线耳机推荐

相较于有线耳机&#xff0c;蓝牙耳机的受欢迎程度可谓是越来越高&#xff0c;当然&#xff0c;这也离不开部分手机取消耳机孔的设计。最近看到很多网友问&#xff0c;适合学生党的蓝牙耳机品牌有哪些&#xff1f;针对这个问题&#xff0c;我来给大家推荐几款性价比高的无线耳机…

VR全景摄影,全景VR展示模式

目前&#xff0c;全景概念已经被大众熟知&#xff0c;很多行业尤其是房产、汽车等已经开始大批量使用全景展示的方式提高获客率和推广率。VR全景摄影以全景摄影技术为基础&#xff0c;结合虚拟现实技术&#xff0c;可以让用户身临其境&#xff0c;沉浸式地感受虚拟环境。 一、V…

【 Spring AOP 】

文章目录 一、什么是 Spring AOP&#xff1f;二、为什要⽤ AOP&#xff1f;三、AOP 的组成四、Spring AOP 的实现五、Spring AOP 实现原理 一、什么是 Spring AOP&#xff1f; AOP&#xff08;Aspect Oriented Programming&#xff09;&#xff1a;⾯向切⾯编程&#xff0c;它…