​LeetCode刷题实战331:验证二叉树的前序序列化

231003-四步MacOS-iPadOS设置无线竖屏随航SideCar 新建虚拟屏幕参考文献。 阅读详情

算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试。所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 !

今天和大家聊的问题叫做 验证二叉树的前序序列化,我们先来看题面:

https://leetcode-cn.com/problems/verify-preorder-serialization-of-a-binary-tree/

示例

示例 1:

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

示例 2:

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

示例 3:

输入: "9,#,#,1"
输出: false

解题

方法一:栈

我们可以定义一个概念,叫做槽位。一个槽位可以被看作「当前二叉树中正在等待被节点填充」的那些位置。

二叉树的建立也伴随着槽位数量的变化。每当遇到一个节点时:

如果遇到了空节点,则要消耗一个槽位;

如果遇到了非空节点,则除了消耗一个槽位外,还要再补充两个槽位。

此外,还需要将根节点作为特殊情况处理。

我们使用栈来维护槽位的变化。栈中的每个元素,代表了对应节点处剩余槽位的数量,而栈顶元素就对应着下一步可用的槽位数量。当遇到空节点时,仅将栈顶元素减 1;当遇到非空节点时,将栈顶元素减 1 后,再向栈中压入一个 2。无论何时,如果栈顶元素变为 0,就立刻将栈顶弹出。

遍历结束后,若栈为空,说明没有待填充的槽位,因此是一个合法序列;否则若栈不为空,则序列不合法。此外,在遍历的过程中,若槽位数量不足,则序列不合法。

class Solution {
    public boolean isValidSerialization(String preorder) {
        int n = preorder.length();
        int i = 0;
        Deque<Integer> stack = new LinkedList<Integer>();
        stack.push(1);
        while (i < n) {
            if (stack.isEmpty()) {
                return false;
            }
            if (preorder.charAt(i) == ',') {
                i++;
            } else if (preorder.charAt(i) == '#'){
                int top = stack.pop() - 1;
                if (top > 0) {
                    stack.push(top);
                }
                i++;
            } else {
                // 读一个数字
                while (i < n && preorder.charAt(i) != ',') {
                    i++;
                }
                int top = stack.pop() - 1;
                if (top > 0) {
                    stack.push(top);
                }
                stack.push(2);
            }
        }
        return stack.isEmpty();
    }
}

作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/verify-preorder-serialization-of-a-binary-tree/solution/yan-zheng-er-cha-shu-de-qian-xu-xu-lie-h-jghn/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

好了,今天的文章就到这里,如果觉得有所收获,请顺手点个在看或者转发吧,你们的支持是我最大的动力 。

上期推文:

LeetCode1-320题汇总,希望对你有点帮助!

LeetCode刷题实战321:拼接最大数

LeetCode刷题实战322:零钱兑换

LeetCode刷题实战323:无向图中连通分量的数目

LeetCode刷题实战324:摆动排序 II

LeetCode刷题实战325:和等于 k 的最长子数组长度

LeetCode刷题实战326:3的幂

LeetCode刷题实战327:区间和的个数

LeetCode刷题实战328:奇偶链表

LeetCode刷题实战329:矩阵中的最长递增路径

LeetCode刷题实战330:按要求补齐数组

BP神经网络回归预测+SHAP可解释分析+新数据预测(MATLAB完整源码) 阅读详情

相关推荐

STM32H743 SD卡读写避坑实录:CubeMX配置MDMA给FATFS,我的FreeRTOS项目踩了哪些雷?

本文详细解析了STM32H743在CubeMX配置中结合SDMMC、MDMA与FATFS的实战避坑指南,特别针对FreeRTOS环境下的SD卡读写问题提供了解决方案。从时钟配置到FATFS参数设置,再到DMA缓存维护和FreeRTOS集成技巧,帮助开发者高效解决数据损坏、DMA传输错误等常见问题,提升项目稳定性。

weixin_30878501的博客 494

LeetCode第331题_验证二叉树的前序序列化

验证二叉树前序序列化的两种解法 本文解析LeetCode 331题,提供两种高效解法: 1️⃣ 栈方法:模拟树的构建过程,通过栈操作合并完整子树。时间复杂度O(n),空间复杂度O(n)。 2️⃣ 计数法:利用入度出度特性,初始差值为1,非空节点提供2个出度,空节点消耗1个入度,最终差值应为0。时间复杂度O(n),空间复杂度O(1)。 代码亮点: 提供C#、Python、C++三种实现 包含边界条件检查 性能对比显示C++实现最优(0ms) 适用场景:需要验证二叉树前序序列化的正确性,或在O(1)空间复杂度下

qq_40263592的博客 1226

YOLOv5实战:无人机巡检图片差异对比与违建标记(附完整代码)

本文详细介绍了如何利用YOLOv5目标检测技术实现无人机巡检图片差异对比与违建标记。通过图像对齐、目标检测、差异分析和可视化标记四个步骤,构建高效的违建识别系统,显著提升城市管理效率。文章包含完整代码实现和性能优化技巧,为计算机视觉在无人机巡检中的应用提供实用指南。

weixin_42535720的博客 281

Java实现 LeetCode 331 验证二叉树的前序序列化

331. 验证二叉树的前序序列化 序列化二叉树的一种方法是使用前序遍历。当我们遇到一个非空节点时,我们可以记录下这个节点的值。如果它是一个空节点,我们可以使用一个标记值记录,例如 #。 _9_ / \ 3 2 / \ / \ 4 1 # 6 / \ / \ / \ # # # # # # 例如,上面的二叉树可以被序列化为字符串 “9,...

南 墙 1万+

虚拟化Esxi 和 华为交换机--配置链路捆绑

在这种模式下,Eth-Trunk的建立和成员接口的加入都需要手工配置,没有LACP协议的参与。● 在没有配置802.3ad聚合时,启用基于IP哈希的路由将中断网络,因此必须先对虚拟交换机进行更改。再去修改交换机的链路聚合模式(交换机配置为手动模式的链路聚合)当服务器需要通过交换机从远端服务器获取配置文件后才可以启动链路聚合时,交换机的链路聚合口需要配置lacp force-forward。● 交换机必须设置手动模式的链路聚合,虚拟交换机的负载平衡方法必须设置为基于IP哈希的路由。

ling 2115

泛微E9开发 明细表字段赋值到主表字段,将各类型合计赋值到主表类型合计中

①绑定明细表类型、预计金额字段的值改变事件,每当有值发生改变,就需要重新计算供应商1、供应商2、供应商3的合计,如果不绑定这两个字段的话,会出现计算不及时或计算错误的问题。②当有明细行被删除时,也需要重新计算供应商1、供应商2、供应商3的合计,比如删除了供应商1的明细行,如果不重新计算,那么供应商1的值还是被删之前的值,合计错误。将各类型合计赋值到主表类型合计中。

a_waste_only的博客 3836

二叉树 - 栈 - 计数 - leetcode 331. 验证二叉树的前序序列化 | 中等难度

二叉树 - 栈 - 计数

分享简单技术,记录点滴成长 1249

Halcon形状模板匹配实战:inspect_shape_model参数优化指南

本文深入解析Halcon形状模板匹配中inspect_shape_model参数的优化技巧,涵盖NumLevels和Contrast参数的实战应用。通过具体案例展示如何平衡匹配速度与精度,帮助开发者高效调试形状模型,提升工业视觉检测的准确性和效率。

weixin_30342209的博客 618

【Leetcode】331. 验证二叉树的前序序列化

每日一题

想要AC的sjh的博客空间 1405

国内优秀MES开源框架

一套springboot 开源框架 代码标准规范化。 界面展示 演示地址 http://wangziyangmes.pzzd.xyz 用户名admin 密码123 系统管理 工艺管理 计划管理 物料管理 *用户管理* *工艺路线管理* 工单下达...

q707231019的博客 2万+

使用 MATLAB/Simulink + Simscape Electrical 来构建一个CCHP微电网与新能源协同运行的模型

随着能源需求的增长和对环境保护要求的提高,冷热电联供(Combined Cooling, Heating and Power, CCHP)系统作为一种高效的分布式能源解决方案,越来越受到关注。CCHP系统通过利用一次能源同时产生电力、制冷和供热,实现了能源的梯级利用,提高了能源使用效率。结合太阳能、风能等可再生能源,可以进一步增强系统的灵活性和环保性。本文将详细介绍如何使用来构建一个CCHP微电网与新能源协同运行的模型,并通过仿真分析其性能表现。本文介绍了如何使用构建一个。

xiaoheshang_123的博客 141

【中等】力扣算法题解析LeetCode331:验证二叉树的前序序列化

LeetCode 331题要求验证字符串是否为有效的二叉树前序序列化,其中空节点用"#"表示。通过槽位计数法实现高效判定:初始化槽位为1(根节点),遍历时非空节点消耗1槽位并新增2槽位,空节点仅消耗1槽位。若过程中槽位为负或最终未归零,则序列无效。Java解法时间复杂度O(n),空间复杂度O(1),关键代码仅需一次遍历和整数计数。典型用例如"9,3,4,#,#,1,#,#"有效,而"1,#"无效。

ylumwd的博客 576

基于ZYNQ的HP总线与DDR交互:实现PL与PS高效数据传输的完整指南

本文将深入探讨如何通过AXI HP总线实现PL与PS的DDR交互,结合代码示例、硬件配置与创新优化,助力开发者掌握这一关键技术。ZYNQ内部通过AXI HP接口直接连接PL与DDR控制器,PL通过AXI协议发送读写请求,绕过PS的CPU直接操作DDR。通过AXI HP总线实现PL与PS的DDR交互,开发者可充分发挥ZYNQ异构架构的优势。在Xilinx ZYNQ系列芯片中,PS(Processing System)与PL(Programmable Logic)的协同设计是其核心优势。

QQ_778132974的博客 1223

LeetCode 331. 验证二叉树的前序序列化

1. 题目 序列化二叉树的一种方法是使用前序遍历。 当我们遇到一个非空节点时,我们可以记录下这个节点的值。 如果它是一个空节点,我们可以使用一个标记值记录,例如 #。 _9_ / \ 3 2 / \ / \ 4 1 # 6 / \ / \ / \ # # # # # # 例如,上面的二叉树可以被序列化为字符串 "9,3,4,#,#,1...

Michael是个半路程序员 1300

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

LeetCode-331. 验证二叉树的前序序列化【栈 树 字符串 二叉树】

例如,上面的二叉树可以被序列化为字符串 “9,3,4,#,#,1,#,#,2,#,6,#,#”,其中 # 代表一个空节点。preorder 由以逗号 “,” 分隔的 [0,100] 范围内的整数和 “#” 组成。输入: preorder = “9,3,4,#,#,1,#,#,2,#,6,#,#”输入: preorder = “9,#,#,1”输入: preorder = “1,#”时间复杂度:O(n)空间复杂度:O(n)时间复杂度:O(n)空间复杂度:O(1)时间复杂度:O(n)空间复杂度:O(n)

zik的博客 1328

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

LeetCode题练习与总结:验证二叉树的前序序列化--331

本文介绍了如何在不重构树的情况下验证二叉树的前序序列化是否有效。通过使用计数器模拟构建过程,我们实现了时间复杂度为O(n)、空间复杂度为O(n)的算法,并总结了相关知识点。

一直学习永不止步 1862

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

【LeetCode: 331. 验证二叉树的前序序列化 + DFS】

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

Coder_ljw的博客 921

思维题,LeetCode331. 验证二叉树的前序序列化

思维题

EQUINOX1的博客 483

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

331. 验证二叉树的前序序列化 LeerCode题目:331. 验证二叉树的前序序列化 我的思路 思考了一小会儿,感觉头绪很乱。想用栈,可是没想出来怎么用。昨晚失眠到凌晨四点半,整天不在状态。于是直接看了题解。发现了几种 有趣 的解法。 解法一:前序遍历建树 题目要求不让建树,但是可以模拟建树的过程,我们不真正建树,而是模拟前序建立二叉树的过程。 我们分析如下树: 1 / \ 2 3 /\ /\ .

Histranger_的博客 323

leetcode-331. 验证二叉树的前序序列化-C 语言

/* * 算法思想: * 借助栈,从后往前遍历字符串,找到#进栈,找到数字的话,则出栈两个元素(如果此时栈内少于两个元素,则 返回失败), * 再把自己进栈,遍历完字符串,栈中只有一个元素为二叉树的根节点。 */ int get_len(char *s){ int i=0; while(*s++ != 0) i++; return i; } b...

SFFS 509

Leetcode 331. 验证二叉树的前序序列化 C++

Leetcode 331. 验证二叉树的前序序列化 题目 序列化二叉树的一种方法是使用前序遍历。当我们遇到一个非空节点时,我们可以记录下这个节点的值。如果它是一个空节点,我们可以使用一个标记值记录,例如 #。 _9_ / \ 3 2 / \ / 4 1 # 6 / \ / \ / \ # # # # 例如,上面的二叉树可以被序列化为字符串 “9,3,4,#,#,1,#,#,2,#,6,#,#”,其中 # 代表一个空节点。 给定一串以逗号分隔的序列,验证它是否是正确的二叉

weixin_43750513的博客 243

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

题目: 思路: 这道题是我今天目前碰到最有意思的题,首先思考只有前序遍历是无法完全确立重建二叉树的 在无法确立二叉树的情况下,得想想二叉树的其他性质 利用性质:空节点视为叶节点,根据性质叶节点数目比非叶节点数目多1来判断。 我们可以定义一个概念,叫做槽位,二叉树中任意一个节点或者空孩子节点都要占据一个槽位。二叉树的建立也伴随着槽位数量的变化。开始时只有一个槽位,如果根节点是空节...

沉迷单车的追风少年 572

leetcode:331. 验证二叉树的前序序列化

首先考虑最简单的情况:怎么判断一个节点是叶子节点。很明显,当一个节点的两个孩子都是。当一个节点不是叶子节点时,那么它必定至少有一个孩子非空!的时候,该节点就是叶子节点。如何判断一颗树是否有效?......

OceanStar的博客 402

【力扣】(中等) 331. 验证二叉树的前序序列化 ---- 辅助栈

331 验证二叉树的前序序列化 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/verify-preorder-serialization-of-a-binary-tree 序列化二叉树的一种方法是使用前序遍历。当我们遇到一个非空节点时,我们可以记录下这个节点的值。如果它是一个空节点,我们可以使用一个标记值记录,例如 #。 _9_ / \ 3 2 / \ / \ 4 1 # 6 / \ / \.

qq_42281215的博客 153

Leetcode 331.验证二叉树的前序序列化

验证二叉树的前序序列化 序列化二叉树的一种方法是使用前序遍历。当我们遇到一个非空节点时,我们可以记录下这个节点的值。如果它是一个空节点,我们可以使用一个标记值记录,例如#。 例如,上面的二叉树可以被序列化为字符串"9,3,4,#,#,1,#,#,2,#,6,#,#",其中#代表一个空节点。 给定一串以逗号分隔的序列,验证它是否是正确的二叉树的前序序列化。编写一个在不重构树的条件下的...

kexinxin1的博客 437

[LeetCode] 331、验证二叉树的前序序列化

阿道夫阿道夫

aift的专栏 264
上一篇: 最强代码生成器平台,杀疯了~
下一篇: 历史上第一个网页它长啥样???
编程IT圈
博客等级 码龄6年 1130粉丝 544原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值