leecode 331 |验证二叉树的前序序列化 | gdb 调试找bug

news2024/10/6 22:27:39

计算的本质是数据的计算
数据的计算需要采用格式化的存储,
规则的数据结果,可以快速的按照指定要求存储数据

这里就不得不说二叉树了,二叉树应用场景真的很多

本题讲的是,验证二叉树的前序序列化

换言之,不采用建立树的结构体去判断给定的数据能否构建前序二叉树

比如前序二叉树的数据为: “9, 3, 4, #, #, 1, #, #, 2, #, 6, #, #”
在这里插入图片描述
就这样,给一字符串,包含整数、‘,’, '#'这三种数据类型
然后这个给定的字符串是二叉树的前序序列,现在需要你判定它是不是真的前序序列化(真的前序序列化是可以构建先序二叉树的)
注意哈 # 表示 空节点

//思路,用栈记录槽
//槽 是节点可存储节点的数量。
//栈顶记录 存储 当前节点
// 如果当前节点为空 槽要 -1 (也就是 栈顶 -1 )(如果栈顶减为 0,退栈)
//注意:在遍历的过程中,栈顶槽的大小是这样确定的,如果遍历到的节点为空节点,stk.top() -=1; 如果遍历到的节点非空,那么stk.top() -= 1; stk.push(2); //完成当前节点 槽 的更新,再在栈push 两个槽
//如果栈为空,但是还没有遍历结束 那证明这个序列构建不了先序二叉树

#include <stack>
#include <string>
#include <iostream>

bool solution(std::string &str){
	std::stack<int> stk;
	int n = str.size();
	int i = 0;
	//最开始,如栈根节点
	stk.push(1);
	while(i < n){
		// 栈为空 直接 return false
		if(stk.empty()){
			return false;			//line 18
		}
		// 如果是 ‘,’ i++
		if(str[i] == ','){
			i++;					// line 24
		}else if(str[i] == '#'){
		//	如果是空节点 当前槽 -1
		stk.top() -= 1;				// line 28
		if(!stk.top()){
				stk.pop();
		}
		// 别忘了 还要 i++	待会会讲我怎么gdb 调试找到这个bug 的(我测试的时候,忘了这块,然后调试定位到这个问题了)
		i++;
		}else{
			// 这里的都是非零节点的处理
			while(i < n && str[i] != ',' && str[i] != '#'){
				i++;
			}
			stk.top() -= 1;			// line 36
			if(!stk.top()){
				stk.pop();
			}
			stk.push(2);
		}
	}
	return stk.emptu();
}
int main(){
	std::string str = "9,3,4,#,#,1,#,#,2,#,6,#,#";
	if(solution(str)){
		std::cout<<" this is true"<<std::endl;
	}else{
		std::cout<<" this is false"<<std::endl;
	}
	return 0;
}

说明一下 上面的注释 //line xxx 是为了写这篇博客方便 定位这行的位置,注意区分
再说一说调试,因为我运行,输入正确的前序序列返回的也是错误的,后面后就gdb 调试
g++ test_331.cpp -g
gdb a.out
b 18
b 24
b 28
b 36

打了四个断点
r
然后单点调试
c
发现一直在 分支 ‘#’ 这块走,
我们定义的是,如果节点为空,槽 - 1
但是这里会一直跑,因为,当栈顶为空,会退栈,把栈下面的第一个元素移成栈顶,接着循环(如果栈 无穷,那在这里死循环 ,因为 i 这个计数器一直没有更新
可以打印 i
p i

好了 ,大概就是这样了。
EOF


 

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

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

相关文章

monocle2 orderCells报错

问题&#xff1a;运行monocle2&#xff08;version2.26.0&#xff09;的orderCells出现以下错误 解决方式&#xff1a;出现错误后&#xff0c;运行以下命令&#xff1a; trace(project2MST, edit T, where asNamespace("monocle")) 然后&#xff0c;在弹出的窗口…

Meta Pixel:助你实现高效地Facebook广告追踪

Meta Pixel 像素代码是用來衡量Facebook广告效果的一个官方数据工具&#xff0c;只要商家有在Facebook上投放广告就需要串联Meta Pixel 像素代码来查看相关数据。 它本质上是一段 JavaScript 代码&#xff0c;安装后可以让用户在自己网站上查看到访客活动。它的工作原理是加载…

如何在CentOS7部署Wiki.js知识库并实现分享好友公网远程使用【内网穿透】

文章目录 1. 安装Docker2. 获取Wiki.js镜像3. 本地服务器打开Wiki.js并添加知识库内容4. 实现公网访问Wiki.js5. 固定Wiki.js公网地址 不管是在企业中还是在自己的个人知识整理上&#xff0c;我们都需要通过某种方式来有条理的组织相应的知识架构&#xff0c;那么一个好的知识整…

小黑逆向爬虫探索与成长之路:小黑独立破解毛毛租数据加密与解密

前言 有道和招标网的加密入口定位在前面两期做了详细的介绍&#xff0c;本小结将通过简单的关键词搜索定位到加密与解密入口 数据接口寻找与请求 根据响应数据长度&#xff0c;确定数据接口&#xff0c;发现传入的参数需要加密&#xff0c;响应的结果需要解密&#xff0c;后…

Python异常处理:基础到进阶的实用指南

前言 大家好&#xff0c;我是海鸽。异常处理在工程文件中必不可少&#xff0c;今天就带大家彻底搞定python的异常处理。 什么是异常 在Python中&#xff0c;异常是指在程序执行过程中出现的错误或异常情况。 当Python解释器无法执行代码时&#xff0c;它会引发异常&#xff0…

Excel 粘贴回筛选后的单元格不能完全粘老是少数据 ,有些单元格还是空的

环境&#xff1a; excel2021 Win10专业版 问题描述&#xff1a; excel 粘贴回筛选后的单元格不能完全粘老是少数据 有些单元格还是空的 复制选择筛选后A1-A10单元格 &#xff0c;定位条件&#xff09;&#xff08;仅可见单元格&#xff09;来访问&#xff0c;或者你可以使用…

算法沉淀 —— 深度搜索(dfs)

算法沉淀 —— 深度搜索&#xff08;dfs&#xff09; 一、计算布尔二叉树的值二、求根节点到叶节点数字之和三、二叉树剪枝四、验证二叉搜索树五、二叉搜索树中第K小的元素 一、计算布尔二叉树的值 【题目链接】&#xff1a;2331. 计算布尔二叉树的值 【题目】&#xff1a; …

MambaMixer、NeSLAM、Talk3D、BundledSLAM、ShapeFusion

本文首发于公众号&#xff1a;机器感知 MambaMixer、NeSLAM、Talk3D、BundledSLAM、ShapeFusion ShapeFusion: A 3D diffusion model for localized shape editing In the realm of 3D computer vision, parametric models have emerged as a ground-breaking methodology fo…

全套医院手术麻醉系统源码 人工智能麻醉系统源码 医疗管理系统源码

全套医院手术麻醉系统源码 人工智能麻醉系统源码 医疗管理系统源码 手术麻醉临床信息系统有着完善的临床业务功能&#xff0c;能够涵盖整个围术期的工作&#xff0c;能够采集、汇总、存储、处理、展现所有的临床诊疗资料。通过该系统的实施&#xff0c;能够规范麻醉科的工作流…

Qt实现通过.css样式文件实时加载QSS样式

初学Qt时要想通过QSS修改控件QWidget&#xff0c;QPushButton等原生基础控件的样式&#xff0c;一般都是直接在.ui文件中直接添加qss&#xff0c;或者在代码中通过setStyleSheet(QString qss)来设置。当程序很大时&#xff0c;很多地方需要复用样式时会非常麻烦&#xff0c;qss…

C++教学——从入门到精通 6.ASCII码与字符型

如何把小写字母转换成大写字母呢&#xff1f; 这个问题问的好&#xff0c;首先我们要新学一个类型——char 这个类型就是字符型 再来说说ASCII码 给大家举几个例子 空格————32 0————48 9————57 A————65 Z————90 a————97 z————122 我们…

LeetCode-560. 和为 K 的子数组【数组 哈希表 前缀和】

LeetCode-560. 和为 K 的子数组【数组 哈希表 前缀和】 题目描述&#xff1a;解题思路一&#xff1a;一边算前缀和一边统计。这里用哈希表统计前缀和出现的次数&#xff0c;那么和为k的子数组的个数就是当前前缀和-k的个数&#xff0c;即preSums[presum - k]。画个图表述就是&a…

NGINX 反向代理 CORS

我遇到了一个问题就是 Nginx 是作为反向代理服务器部署的&#xff0c;但因为 Nginx 的配置导致 CORS 问题。 在这个时候我们可以对 Nginx 的配置文件进行修改&#xff1a; 在 location 后添加下面的内容&#xff1a; add_header Access-Control-Allow-Origin *; add_header A…

Kafka入门到实战-第二弹

Kafka入门到实战 Kafka快速开始官网地址Kafka概述Kafka术语Kafka初体验更新计划 Kafka快速开始 官网地址 声明: 由于操作系统, 版本更新等原因, 文章所列内容不一定100%复现, 还要以官方信息为准 https://kafka.apache.org/Kafka概述 Apache Kafka 是一个开源的分布式事件流…

ES6学习之路:迭代器Iterator和生成器Generator

迭代器 一、知识背景 什么是迭代器 迭代器就是在一个数据集合中不断取出数据的过程迭代和遍历的区别 遍历是把所有数据都取出迭代器注重的是依次取出数据&#xff0c;它不会在意有多少数据&#xff0c;也不会保证能够取出多少或者能够把数据都取完。比如斐波那契额数列&#…

离散时间动态系统的集成自适应动态规划智能控制-北科大博毕

主要内容&#xff1a; 传统值迭代产生迭代控制策略&#xff0c;给出稳定性和吸引域判据&#xff1b;传统值迭代则迭代过程中得到可容许策略折扣因子对迭代控制策略可容许的影响&#xff0c;神经网络对未知系统建模&#xff0c;讨论模型网络权重更新情况下参数误差和系统状态估…

TikTok零播放?可能是海外代理IP的问题

在当今社交媒体的蓬勃发展中&#xff0c;TIKTOK作为一款备受欢迎的短视频平台&#xff0c;其直播功能也逐渐受到用户的青睐。然而&#xff0c;有时候跨境电商商家在进行直播时却面临着一个令人头疼的问题&#xff1a;没有观众。这时候&#xff0c;海外代理IP可能是一个潜在的原…

吴恩达:别光盯着GPT-5,用GPT-4做个智能体可能提前达到GPT-5的效果

最近&#xff0c;斯坦福大学教授吴恩达在演讲中提到&#xff0c;他们发现&#xff0c;基于 GPT-3.5 构建的智能体工作流在应用中表现比 GPT-4 要好。 AI 智能体是去年很火的一个话题&#xff0c;但是 AI 智能体到底有多大的潜力&#xff0c;很多人可能没有概念。 最近&#x…

【环境搭建】(四)ubuntu22.04系统安装Opencv4.8.0+Opencv-contrib4.8.0

一个愿意伫立在巨人肩膀上的农民...... 一、安装下载所需工具 1.打开终端&#xff0c;输入以下命令来更新软件源&#xff1a; sudo apt-get update 2.安装wget&#xff1a; sudo apt-get install wget 3.下载opencv和opencv-contrib包&#xff1a; wget -O opencv-4.8.0.…

ISP-VPN实验

文章目录 ISP-VPN实验一&#xff0c;实验拓扑二、实验要求三、IP规划四、实验配置1、IP配置R1的配置R2的配置R3的配置R4的配置R5的配置 2、配置缺省路由3、认证与被认证配置4、HDLC封装5、构建MGRE和GRE6、整个私有网络基于RIP全网可达7、查看路由配置和PC端配置8、PC端pingR5的…