剑指 Offer !37. 序列化二叉树

news2025/1/10 15:57:36

剑指 Offer 37. 序列化二叉树
请实现两个函数,分别用来序列化和反序列化二叉树。

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

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

在这里插入图片描述
思路:使用先进先出的队列完成二叉树的按层遍历BFS。
在下面的序列化、反序列化函数中,为了保持一致性,规定:只有当结点不为null时,才允许进入队列queue。

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

    // Encodes a tree to a single string.
    public String serialize(TreeNode root) {
        ArrayList<String> ans = new ArrayList<>();
        Queue<TreeNode> queue = new LinkedList<>();
        if(root!=null){// 这样省去了“讨论root为null”的麻烦
            queue.offer(root);
             ans.add(String.valueOf(root.val));
        }
        
        while(!queue.isEmpty()){
            TreeNode cur = queue.poll();
            if(cur.left!=null){
                queue.offer(cur.left);
                ans.add(String.valueOf(cur.left.val));
            }else{
                ans.add("null");
            }

            if(cur.right!=null){
                queue.offer(cur.right);
                ans.add(String.valueOf(cur.right.val));
            }else{
                ans.add("null");
            }
            
        }
        int i=0,index=0;
        for(String s:ans){
            if(!s.equals("null")){
                index=i;
            }
            i++;
        }

        StringBuilder builder = new StringBuilder();
        builder.append("[");
        if(ans.size()==0){
            return builder.append("]").toString();
        }
        builder.append(ans.get(0));
        for(i=1;i<=index;i++){
            builder.append(","+ans.get(i));
        }
        builder.append("]");
        return builder.toString();
        
    }

    // Decodes your encoded data to tree.
    public TreeNode deserialize(String data) {
        if(data.substring(1,data.length()-1)==""){
            return null;
        }
        String[] strs = data.substring(1,data.length()-1).split(",");        
        
        Queue<TreeNode> queue = new LinkedList<>();

        TreeNode root = new TreeNode(Integer.parseInt(strs[0]));
        queue.offer(root);
        int index=0;
        while(!queue.isEmpty()){
            TreeNode cur = queue.poll();
            if(index+1<strs.length&&!strs[++index].equals("null")){
                cur.left = new TreeNode(Integer.parseInt(strs[index]));
                queue.offer(cur.left);
            }
            if(index+1<strs.length&&!strs[++index].equals("null")){
                cur.right = new TreeNode(Integer.parseInt(strs[index]));
                queue.offer(cur.right);
            }
        }
        return root;
        
    }
    
}

// Your Codec object will be instantiated and called as such:
// Codec codec = new Codec();
// codec.deserialize(codec.serialize(root));

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

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

相关文章

Day43

思维导图 深拷贝和浅拷贝 1> 如果类中有指针成员时&#xff0c;如果没有显性的定义拷贝构造和拷贝赋值函数&#xff0c;系统默认提供的都只能实现浅拷贝&#xff0c;需要显性定义出深拷贝函数&#xff0c;为了完成指针成员的独立赋值&#xff0c;如果类中没有指针成员&#…

java面向对象之java继承

文章目录 一、java继承总结 一、java继承 继承的概念 继承是java面向对象编程技术的一块基石&#xff0c;因为它允许创建分等级层次的类。 继承就是子类继承父类的特征和行为&#xff0c;使得子类对象&#xff08;实例&#xff09;具有父类的实例域和方法&#xff0c;或子类…

Java之集合Collection

Collection接口有两个子接口&#xff1a;List(链表|线性表)和Set(集) ---|Collection: 单列集合---|List: 有存储顺序, 可重复---|ArrayList: 数组实现, 查找快, 增删慢由于是数组实现, 在增和删的时候会牵扯到数组增容, 以及拷贝元素. 所以慢。数组是可以直接按索引查找, 所以…

less和sass

less和sass 相比于css解决了什么问题&#xff1f; 答案&#xff1a;less和sass可以嵌套&#xff0c;可以使用变量&#xff1b;而css不可以 BEM/CSS modules/Atomic CSS/CSS in JS&#xff0c;这些方案应用于工程化中&#xff0c;解决了的问题是&#xff1a; 多人协同/大规模场…

Leonard ai 画明代皇帝肖像

链接&#xff1a; https://app.leonardo.ai/ai-generations prompt&#xff1a; Highly detailed doodle illustration of a Chinese emperor centered, isometric, mural, doodle, composition, shape, pattern, vector art ready to print Negative Prompt&#xff1a; …

mysql 触发器

触发器&#xff1a;当对某张表进行 INSERT、DELETE、UPDATE 操作时&#xff0c;会自动触发定义的触发器中的操作。顾名思义&#xff0c;当我们为某张表定义触发器后&#xff0c;向表中添加、删除、修改数据时&#xff0c;会触发触发器中定义的操作&#xff0c;触发器像是一个事…

Python语言中while循环的应用举例

Python语言中while循环的应用举例 while循环语句是Python语言中除了for循环外另一种循环结构&#xff0c;是需要掌握的两大循环语句之一。本文将基于例子讲解Python语言中while循环的应用&#xff0c;并用两个例子说明其应用。 一、while循环语句的含义 while语句用于在满足…

vue3学习之路

Vue3简介 面临的问题&#xff1a;随着功能的增长&#xff0c;复杂组件的代码变得难以维护&#xff0c;Vue3 就随之而来&#xff0c;TypeScript 使用的越来越多&#xff0c;Vue3就是 TS 写的所以能够更好的支持 TypeScript 在这里介绍就这么简单 vue2 的绝大多数的特性 在 Vu…

12.通用定时器基本原理

1.通用定时器概述&#xff1a; &#xff08;1&#xff09;STM32定时器 STM32F10x系列总共最多有8个定时器&#xff1a; &#xff08;2&#xff09;三种STM32定时器区别&#xff1a; &#xff08;3&#xff09;通用定时器功能特点描述&#xff1a; STM32的通用TIMx(TIM2、TIM…

快速点特征直方图(FPFH)描述子提取

快速点特征直方图&#xff08;Fast Point Feature Histograms&#xff0c;FPFH&#xff09;介绍 快速点特征直方图&#xff08;Fast Point Feature Histograms&#xff0c;FPFH&#xff09;是一种基于点的描述子&#xff0c;用于描述点云数据中的局部几何信息。FPFH描述子是在…

Scrapy框架之认识MongoDB

目录 MongoDB 简介 特点 MongoDB的适用场景 MongoDB的行业具体应用 如何抉择是否使用MongoDB MongoDB 简介 MongoDB 是免费开源的跨平台 NoSQL 数据库&#xff0c;命名源于英文单词 humongous&#xff0c;意思是「巨大无比」&#xff0c;可见开发组对 MongoDB 的定位。…

go读写文件总结

别人的经验&#xff1a; 如今任何计算机系统每天都会产生大量的日志或数据。随着系统的增长&#xff0c;将调试数据存储到数据库中是不可行的&#xff0c;因为它们是不可变的&#xff0c;主要用于分析和解决故障的目的。因此&#xff0c;企业倾向于将其存储在文件中&#xff0…

2023一建建筑市政全彩图文教材

本《建筑学全彩图文教材》改编自2022年官方指定的最新版本一级建造师《建筑工程管理与实务》教材。适用于2023年的第一次建造考试。2023年版教材出版上市后&#xff0c;我们将重点关注教材。补充电子版在变更处提供。 本书忠于官方原版教材&#xff0c;并不删除任何知识点&…

当大模型遇到数据仓库 HashData助力LLM规模化应用

6月30日&#xff0c;由 IT168主办的第十六届中国系统架构师大会&#xff08;SACC2023&#xff09;在北京开幕。本届大会以“数字转型 架构演进”为主题&#xff0c;议题涵盖AIGC大数据、多云多活、云成本等多个热门领域。 在会上&#xff0c;酷克数据首席科学家杨胜文发表了题…

UWB超宽带定位技术的原理及定位方法

uwb定位技术即超宽带技术&#xff0c;它是一种无载波通信技术&#xff0c;利用纳秒级的非正弦波窄脉冲传输数据&#xff0c;因此其所占的频谱范围很宽。传统的定位技术是根据信号强弱来判别物体位置&#xff0c;信号强弱受外界 影响较大&#xff0c;因此定位出的物体位置与实际…

JAVA-编程基础-08-Java异常处理全面解析

Lison <dreamlison163.com>, v1.0.0, 2023.04.01 JAVA-编程基础-08-Java异常处理全面解析 文章目录 JAVA-编程基础-08-Java异常处理全面解析什么是异常Exception和Error的区别checked和unchecked异常”关于 throw 和 throws关于 try-catch-finally小结 try-with-resourc…

升级Xcode14.3,项目无法运行解决

报错&#xff1a;link command failed with exit code 1(use -v to see invocaiton) 原因&#xff1a;新版本Xcode删除了特定目录下的一些文件 解决&#xff1a; post_install do |installer|installer.pods_project.targets.each do |target|target.build_configurations.e…

O2OA(翱途)开发平台如何在流程表单中使用基于Vue的ElementUI组件?

本文主要介绍如何在O2OA中进行审批流程表单或者工作流表单设计&#xff0c;O2OA主要采用拖拽可视化开发的方式完成流程表单的设计和配置&#xff0c;不需要过多的代码编写&#xff0c;业务人员可以直接进行修改操作。 在流程表单设计界面&#xff0c;可以在左边的工具栏找到Ele…

Linux--显示当前路径下的所有文件指令:ls

一、ls是list的简写 二、语法&#xff1a; ls [选项] [目录或文件] 三、功能&#xff1a; ①对于目录&#xff0c;该命令列出当前目录下的所有子目录与文件。 ②对于文件&#xff0c;将列出文件名以及其他信息。 四、常用选项&#xff1a; 1.-a 列出目录下的所有文件&…

Java实现将数据转成xmind脑图(附有工具类)。

&#x1f61c;作 者&#xff1a;是江迪呀✒️本文关键词&#xff1a;Java、工具类、xmind、脑图、转换☀️每日 一言&#xff1a;昨日已成过去,未来充满可能,唯有珍惜现在。 [TOPC] 前言 当谈到Xmind时&#xff0c;这是一个非常流行的思维导图工具&#xff0c;可…