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

news2024/11/18 8:35:25

今天早上睡起来刷了这么一道题,二叉树的序列化和反序列化

大概意思就是给你一个二叉树,把他转成一个字符串,中间的自定义规则由你定,再根据这个字符串去还原这个二叉树,这道题的话思路不难,写起来有的细节要处理,反正我也是搞了好一会搞出来了。

要把他转成字符串,考察的就是遍历顺序,在这里前序 后序 层序都是可以的,为什么中序不行。因为中序拿不到根节点,懂我意思吧。

这道题要反序列化,其实就是恢复二叉树嘛。学过二叉树肯定写过前中序去恢复二叉树,后中序去恢复二叉树。为什么呢?前序遍历出来第一个总是根,然后我们根据这个根去划分中序和前序的区间去恢复二叉树。同理后序总能拿到最后一个是根。

因此这个反序列化,拿到根尤为重要。相当于你是依靠一种遍历去恢复二叉树的。

前序遍历从上到下遍历完之后,拿到结果后从下往上递归着去恢复二叉树。

我是拿前序遍历写的,就前序讲一些细节吧

首先自定义规则,遇到空结点我们用'#'去代替,每次结点之间拿空格去分开' '

就会有如下的字符串 :1 2 '#' 3 4 '#'

遍历搞成字符串应该不难,c++的话了解用to_string这个api

下面关键是1 2 '#' 3 4 '#'恢复成二叉树

这块就需要我们去分割字符串了,我们用下标去分割

遇到'#'下标跳过,遇到结点跳过,这样的每次都会跳到' ',因此进入递归前下标还得++一次。

奇葩的是leco测试用例新加了负数进去,我们在恢复的时候要加个标记,判断是正负数来正确恢复

大概就是这样了~~代码我给了详细注释,看一遍应该能看懂

 代码示例:

class Codec {
private:
    //前序遍历转成字符串
    void traverse(TreeNode*root,string &res)
    {
        if(!root){
            res+='#';  //用#代表null
            return;
        }
        res+=to_string(root->val)+' '; //1 2 # 3...
        traverse(root->left,res);
        traverse(root->right,res);
    }
    //把这个字符串返还成树
    TreeNode* oppositeTraverse(string &res,int &index)//index是这个字符串的下标
    {
        if(index>=res.size())return nullptr;
        if(res[index]=='#')//说明走到空结点了
        {
            index++; //下标移到下一个位置,越过'#'
            return nullptr;//返回空
        }
        int val=0,flag=1;//sign用来分正负数的,lecod测试用例加了负数进去
        if (res[index] == '-') 
        {
            flag = -1;
            index++ ;
        }
        while(res[index]!=' ')
        {
            val=val*10+res[index]-'0';
            index++;
        }
        val*=flag;//正数就是正,负数就是负的
        index++;//越过' '

        TreeNode* root=new TreeNode(val);
        root->left=oppositeTraverse(res,index);
        root->right=oppositeTraverse(res,index);
        return root;
    }
public:
    // Encodes a tree to a single string.
    string serialize(TreeNode* root) {
        string res="";
        traverse(root,res);
        return res;
    }

    // Decodes your encoded data to tree.
    TreeNode* deserialize(string data) {
        int index=0;
        return oppositeTraverse(data,index);
    }
};

ok~继续保持自律,每天给自己洗脑。唉好想躺平

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

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

相关文章

【云原生 | Kubernetes 实战】13、K8s 常见的存储方案及具体应用场景分析(上)

目录 K8s 持久化存储 一、k8s 持久化存储:emptyDir 二、k8s 持久化存储:hostPath 三、k8s 持久化存储:nfs 3.1 搭建 nfs 服务 3.2 创建Pod,挂载 NFS 共享出来的目录 3.3 测试 pod 挂载 nfs 是否成功 K8s 持久化存储 在 k8s…

[附源码]Nodejs计算机毕业设计基于框架的在线问答平台Express(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程。欢迎交流 项目运行 环境配置: Node.js Vscode Mysql5.7 HBuilderXNavicat11VueExpress。 项目技术: Express框架 Node.js Vue 等等组成,B/S模式 Vscode管理前后端分…

[附源码]Python计算机毕业设计公租房管理系统Django(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等…

ASPICE详细介绍-1.什么是ASPICE?

什么是ASPICE? ASPICE全称是“Automotive Software Process Improvement and Capacity dEtermination”,即汽车软件过程改进及能力评定,简称A-SPICE或ASPICE。 属于过程模型,由过程和能力度两个维度构成,用于评价汽车…

DBeaver连接hive(详细图解)

文章目录DBeaver 简介使用DBeaver连接hive(1)配置Maven仓库(2)配置hive驱动(3)创建hive连接(4)连接测试DBeaver 简介 dbeaver是免费和开源(GPL)为开发人员和数…

RK3588平台开发系列讲解(AUDIO篇)Linux音频调试--alsa-utils 工具

平台内核版本安卓版本RK3588Linux 5.10Android 12文章目录 一、工具介绍二、工具的使用2.1 aplay2.2 arecord2.3 amixer2.4 aplay | arecord沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇将介绍Linux下audio调试工具alsa-utils的使用方法。 一、工具介绍 RK平台…

[ 数据结构 -- 手撕排序算法第一篇 ] 插入排序

文章目录前言一、常见的排序算法二、插入排序的实现2.1 基本思想2.2 直接插入排序2.2.1 单趟排序的代码实现三、插入排序代码实现四、插入排序测试五、插入排序的时间复杂度5.1 最坏的情况下5.2 最好的情况下六、直接插入排序特性总结总结前言 手撕排序算法第一篇:…

HashSet源码解析

HashSet源码解析 问题 (1)集合(Collection)和集合(Set)有什么区别? (2)HashSet 怎么保证添加元素不重复? (3)HashSet 是否允许 nu…

基于nodejs大学生宿舍管理系统的设计与实现.zip(论文+源码+ppt文档+视频录制)

相关资料下载地址:请点击下载》》》 1 绪论 3 1.1 项目开发背景和意义 3 1.2 项目研究现状 3 1.3 项目主要的内容 4 2 相关技术介绍及环境开发条件 4 2.1相关技术介绍 4 2.1.1 nodejs开发框架 4 2.1.2 MySQL数据库 5 2.1.3VSCODE开发工具 6 2.2环境开发条件 6 3 系…

C51——震动控制喇叭

通过继电器使得喇叭稍微的带一点点智能的感觉: 当振动传感器模块 感受到震动的时候让喇叭响起来,这喇叭之后两根线来供电,这便少不了继电器的作用 震动模块,继电器和单片机的连接方式在前面已经提到了 这里我们先让电源的负极和…

就是收藏,不解释。Jmeter接口测试数据库断言的实现与设计

接口测试大部分都使用接口的响应值作为接口验证的依据,但在与数据库有交互的接口中这种结果判断不足以判断接口的正确性,本文将以jmeter作为接口测试的工具来实现接口的数据库断言 一、总体思路概述 使用jmeter发起接口请求使用json提取器获取接口响应结…

双指针算法(尺取法)

目录 一 算法简介 1)算法解释 2)概述 3)分类 4)前提 5)算法模板 6)常见问题 二 算法实践 1)反向扫描 1)反转字符串(一) 题目描述 思路 解法 2&…

fiddler抓包 - Android 虚拟机

导出fiddler 证书 将Fiddler的证书导出到电脑,点击Tools -> Options -> HTTPS -> Actions -> Export Root Certificate to Desktop 下载和安装openssl 添加一下path :C:\Program Files\OpenSSL-Win64\bin 证书格式转换与重命名 1、将Fiddler cer证书转…

CS61A Proj 3

更好的阅读体验 Project 3: Ants Vs. SomeBees ants.zip The bees are coming! Create a better soldier With inherit-ants. Introduction Important submission note: For full credit, Submit with Phase 1 complete by Thursday, March 3 (worth 1 pt).Submit with Phase …

【Flink】Flink 1.13 版本 KafkaSource 代码解读

文章目录 1.概述2. 案例3.源码解读3.1 build3.2 handleOperatorEvent3.3 addSplits3.4 createSplitFetcher3.5 创建SplitFetcher2.6 运行2.7 启动 SplitFetcher2.8 runOnce2.9 fetchTask.run2.9 fetch1.概述 因为最近看到新版本的kafka source进行改版了,于是就想测试一下看看…

Gradle学习笔记之任务

文章目录任务入门任务行为任务的依赖方式参数依赖内部依赖外部依赖多种依赖方式的混合跨项目依赖任务执行gradle run命令演示gradle projects演示gradle tasks演示gradle tasks --all演示查看指定的任务组任务查看某一任务的详细信息查看项目的依赖关系查看项目的属性信息任务类…

RCNN网络源码解读(Ⅱ) --- 使用IOU计算正负样本用于finetune训练

目录 1.预训练二分类器Alexnet 1.1 code(finetune.py) 2.二分类数据集处理 2.1 code(cerate_classifier_data.py) 1.预训练二分类器Alexnet 1.1 code(finetune.py) 1.引入头文件 import os import c…

阿里是如何使用分布式架构的,阿里内部学习手册分享

为什么要使用分布式架构?分布式架构解决了互联网应用的两大难题:高并发和高可用。高并发指服务器并发处理客户端请求的数量大,而高可用指后端服务能始终处于可用状态。 提高系统容量 随着业务越来越复杂,服务也会变得越来越复杂…

CS61A Proj 2

更好的阅读体验 Project 2: CS 61A Autocorrected Typing Software cats.zip Programmers dream of Abstraction, recursion, and Typing really fast. Introduction Important submission note: For full credit: Submit with Phase 1 complete by Thursday, February 17, wo…

ADI Blackfin DSP处理器-BF533的开发详解55:CVBS输入-DSP和ADV7180的应用详解(含源码)

硬件准备 ADSP-EDU-BF533:BF533开发板 AD-HP530ICE:ADI DSP仿真器 软件准备 Visual DSP软件 硬件链接 CVBS IN 视频输入 硬件实现原理 CVBS_IN 子卡板连接在 ADSP-EDU-BF53x 开发板的扩展端口 PORT3 和 PORT4 上,板卡插入时,…