leetcode331. 验证二叉树的前序序列化

news2024/11/17 0:07:00

序列化二叉树的一种方法是使用 前序遍历 。当我们遇到一个非空节点时,我们可以记录下这个节点的值。如果它是一个空节点,我们可以使用一个标记值记录,例如 #

例如,上面的二叉树可以被序列化为字符串 "9,3,4,#,#,1,#,#,2,#,6,#,#",其中 # 代表一个空节点。

给定一串以逗号分隔的序列,验证它是否是正确的二叉树的前序序列化。编写一个在不重构树的条件下的可行算法。

保证 每个以逗号分隔的字符或为一个整数或为一个表示 null 指针的 '#' 。

你可以认为输入格式总是有效的

  • 例如它永远不会包含两个连续的逗号,比如 "1,,3" 。

注意:不允许重建树。

示例 1:

输入: preorder = "9,3,4,#,#,1,#,#,2,#,6,#,#"
输出: true

示例 2:

输入: preorder = "1,#"
输出: false

示例 3:

输入: preorder = "9,#,#,1"
输出: false
/**
 * @param {string} preorder
 * @return {boolean}
 */
var isValidSerialization = function(preorder) {
    let n = preorder.length;
    let i = 0;
    let stack = [1];
    while(i < n){
        if(!stack.length) return false;
        if(preorder[i] == ","){
            i++;
        } else if(preorder[i] == "#"){
            stack[stack.length - 1]--;
            if(stack[stack.length - 1] == 0){
                stack.pop();
            }
            i++;
        } else {
            while(i < n && preorder[i] !== ","){
                i++;
            }
            stack[stack.length - 1]--;
            if(stack[stack.length - 1] == 0){
                stack.pop();
            }
            // 不同的是,我们找到的是数字,只要是有效数字必然会有两个儿子节点,还需要我们继续往后找
            stack.push(2);
        } 
    }
    return !stack.length;
};

// 画图来讲下这个图 比较形象

// 根据例子一来看,首先我们有个栈,

// 首先,栈里面得有个1,代表即将要添加一个元素进来,然后就拿到这个9,代表拿到一个真正的节点,现在不需要这个1了,给他-1

// 变成0;但是压入栈的数字变成0,代表我们把想要的节点压入进来了,现在开始弹栈了

// 但是一个节点下面有两个儿子节点,所以说我们再给他添加两个节点进来,所以给他压入一个2;压入2 代表我们需要添加两个节点,不管这两个节点是否为空;

// 接下来,我们拿到了一个节点3,拿到了一个,就把 2-1;此时还有一个节点未添加;此时3也是个有效节点,有效节点证明3下面也有两个儿子;

// 所以再压入一个2;接着往下找,找到了一个4,证明 3已经找到了一个儿子节点,就把这个2-1;这个时候4也是一个有效节点,所以再压入一个2,证明我们下面还需要加两个子节点;

// 然后是两个#号,#号代表是空节点,空节点下面是没有儿子的;所以说。我们就只添加不消耗;就把栈顶的2给消耗了

// 然后把这两个#号销掉了,往后找到了一个1,那么这个1 是3的另一个儿子,此时3的两个儿子都已经找打了,所以就把此时栈顶的1,给消耗了。

// 但是这个3 被消耗掉了,这个1也是有效数字,1下面还有两个儿子,再把2给压入栈,发现1 后面是有两个#,

// #代表只消耗不增加,所以把栈顶的2 给消耗了;

// 后面发现了数字2,从数字3到 2 前面的位置,这一段已经找完了,发现数字是数字9的儿子,所以数字9的位置就是0了

//  -1 +2;

// 所以9的儿子 3和2已经找完了;发现2也是有效数字,下面也有两个儿子,往后找,发现一个#,#号是只消耗不增加,

// 所以栈顶2减去1,所以往后找,发现,2有两个儿子,一个是#号,一个是6,所以栈顶的1被新找到的儿子6给消耗掉了;6下面也有两个儿子 ;压入2,往后找是两个#号,继续消耗,变成了0; 此时栈已经空了,证明这个序列化就是正确的;




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

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

相关文章

【含文档】基于Springboot+Vue的高校师资管理系统(含源码+数据库+lw)

1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 服务器: SpringBoot自带 apache tomcat 主要技术: Java,Springboot,mybatis,mysql,vue 2.视频演示地址 3.功能 系统定…

构建高效线上培训体系的知识库策略

在数字化时代&#xff0c;线上培训已成为企业提升员工技能、促进知识传递的重要手段。然而&#xff0c;如何构建一个高效、系统的线上培训体系&#xff0c;确保培训内容的准确性与时效性&#xff0c;是许多企业面临的共同挑战。其中&#xff0c;知识库作为培训资源的核心载体&a…

Arduino中实现定时器中断

1、使用MsTimer2库文件 使用之前需要先添加库 &#xff08;1&#xff09;实现功能 &#xff08;2&#xff09;代码 /*MsTimer2 is a small and very easy to use library to interface Timer2 withhumans. Its called MsTimer2 because it "hardcodes" a resolutio…

99页PPT | 智慧城市运营大数据平台解决方案

方案内容综述 这是一套综合性的解决方案&#xff0c;旨在通过先进的数据分析和处理技术&#xff0c;提升城市管理的智能化水平。平台基于运营商的运营理论构建&#xff0c;通过整合城市各个层面的数据资源&#xff0c;实现对城市运行状态的全面监测、分析和优化。 城市大数据公…

MySQL的登录、访问、退出

一、登录&#xff1a; 访问MySQL服务器对应的命令&#xff1a;mysql.exe ,位置&#xff1a;C:\Program Files\MySQL\MySQL Server 8.0\bin &#xff08;mysql.exe需要带参数执行&#xff0c;所以直接在图形界面下执行该命令会自动结束&#xff09; 执行mysql.exe命令的时候出…

【Linux】进程的标识符、状态(超详解)

目录 进程的概念 进程标识符PID 系统调用创建进程-fork初识 进程状态 R状态&#xff08;运行状态&#xff09; S&#xff0c;D状态&#xff08;休眠状态&#xff09; T&#xff0c;t状态 Z状态&#xff08;僵尸进程&#xff09; 孤儿进程 X状态&#xff08;死亡状态&a…

深度学习500问——Chapter15:异构计算,GPU和框架选型(1)

文章目录 异构计算&#xff0c;GPU和框架选型指南 15.1 什么是异构计算 15.2 什么是GPU 15.3 GPU架构简介 15.3.1 如何通俗理解GPU的架构 15.3.2 CUDA的核心是什么 15.3.3 为什么要使用GPU 异构计算&#xff0c;GPU和框架选型指南 深度学习训练和推理的过程中&#xff0c;会涉…

塑封芯片多大才需要点胶加固保护?

塑封芯片多大才需要点胶加固保护&#xff1f; 塑封芯片是否需要点胶加固保护&#xff0c;并不完全取决于芯片的大小&#xff0c;而是由多种因素共同决定的。以下是一些影响是否需要点胶加固保护的主要因素&#xff1a; 芯片的应用场景&#xff1a;如果芯片所处的环境较为恶劣&a…

四种msvcp120.dll丢失的解决方法,简单几步将丢失的msvcp120.dll修复

如果你在使用电脑的时候遇到了msvcp120.dll文件丢失的问题应该怎么办呢&#xff1f;如何修复丢失的msvcp120.dll的问题呢&#xff1f;今天那就和大家聊聊msvcp120.dll丢失的解决办法&#xff0c;详细说说msvcp120.dll的解决办法步骤。 修复“msvcp120.dll”丢失问题的详细方法 …

Vue3使用vue-quill富文本编辑器

安装依赖 npm install vueup/vue-quill quill quill-image-uploader自定义字体 把自定义字体样式放入font.css中在main.js中导入 .ql-snow .ql-picker.ql-font .ql-picker-label[data-valueSimSun]::before, .ql-snow .ql-picker.ql-font .ql-picker-item[data-valueSimSun]…

GitLab发送邮件功能详解:如何配置自动化?

GitLab发送邮件的设置指南&#xff1f;怎么优化GitLab发送邮件&#xff1f; GitLab作为一个强大的代码管理平台&#xff0c;不仅提供了代码托管、CI/CD等功能&#xff0c;还集成了发送邮件的功能&#xff0c;使得开发团队能够及时获取项目动态。AokSend将详细介绍如何配置GitL…

暗黑破坏神4第六赛季开荒攻略,如何高效开荒刷图打装备?

暗黑破坏神4的第六赛季将于10月8日开启&#xff01;要是你总觉得电脑开荒刷图打装备效率低&#xff0c;想知道有什么办法在手机上玩暗黑破坏神4&#xff1f;那这款专为游戏玩家打造的远程控制软件——网易GameViewer远程&#xff0c;就太适合你了&#xff01;不仅可以在手机上玩…

Linux下文件/目录操作的相关函数

1.文件系统 把一个磁盘分成一个或多个分区。每个分区可用包含一个文件系统 文件系统是&#xff0c;一组规则&#xff0c;规定对文件的存储及读取的一般方法。文件系统在磁盘格式化过程中指定。 常见的文件系统有&#xff1a;fat32 ntfs exfat ext2 、ext3 、ext4 inode是固定…

WSL进阶体验:gnome-terminal启动指南与中文显示问题一网打尽

起因 我们都知道 wsl 启动后就死一个纯命令行终端&#xff0c;一直以来我都是使用纯命令行工具管理Linux的。今天看到网上有人在 wsl 中启动带图形界面的软件。没错&#xff0c;就是在wsl中启动带有图形界面的Linux软件。比如下面这个编辑器。 ​​ 出于好奇&#xff0c;我就…

革新体验:细数3D在线预览在多个行业的广泛应用

‌3D在线预览展示技术的应用领域非常广泛&#xff0c;涵盖了从电子商务、产品设计、建筑设计到文化遗产保护等多个方面。‌ ‌1、电子商务‌&#xff1a; 在电商领域&#xff0c;3D展示技术为商品提供了全方位的展示&#xff0c;包括产品的外观、功能和卖点。这种交互式的购物…

影刀RPA实战:java结合影刀同步采购订单数据

1.实战目标 本次实战我们用java语言结合影刀&#xff0c;实现从自用ERP系统同步订单到旺店通中&#xff0c;在工作中&#xff0c;有时候我们的运营数据不是直接在旺店通ERP中操作&#xff0c;比如我们有自己的ERP&#xff0c;完成一些特定的内部工作后&#xff0c;再把数据同步…

做一个能适配「手机」的网站需要注意什么

这个问题的答案其实简单。 只要在网站前端开发过程中&#xff0c;将网站做成响应式布局&#xff0c;也就是 RWD &#xff08;Responsive Web Design&#xff09;就可以啦&#xff01;当手机或者不同设备打开网站时&#xff0c;通过检测视口分辨率来自动呈现不同的尺寸布局内容…

小程序弹出框是没办法遮挡住底部的tabbar的,解决的办法是使用自定义tabbar。。uni-app小程序如何自定义tabbar

原生小程序方法自定义 tabBar | 微信开放文档 如果是uni-app的小程序应该怎么自定义呢&#xff1f; 不是用page.json里面的tabbar就需要修改page.json.加上 "custom": true 注意list数组还是按照正常的来写。所以不使用但是也不能删除。 我们知道uni-app里面的页…

数字人形象自定义制作:readyplayer

网址&#xff1a; https://readyplayer.me/ 支持上传照片和拍照&#xff0c;会自动识别变成卡通风格 其他选项是配置选项&#xff1a;穿着、样貌等 上面弄好后右上角点击next&#xff0c;创建的模型可以下载3d glb文件 glb文件在线打开&#xff1a; https://gltf-viewer.d…

docker-文件复制(docker cp:用于在Docker主机和容器之间拷贝文件或目录)

文章目录 1、把宿主机的文件复制到容器内部1.1、查询 宿主机 root 下的文件1.2、docker cp /root/anaconda-ks.cfg spzx-redis:/root1.3、查看 spzx-redis 容器 中/root目录下是否有 anaconda-ks.cfg 文件 2、把容器中的文件 复制 到宿主机中2.1、查看 spzx-redis 容器 / 下的文…