当前位置: 首页 > article >正文

PTA数据结构实战:层次遍历巧解二叉树叶结点输出

1. 从问题理解到解题思路第一次看到PTA上这道二叉树题目时我也被题目描述唬住了。题目要求按从上到下、从左到右的顺序输出所有叶结点这不就是典型的层次遍历BFS应用场景吗但仔细分析输入格式后我发现有几个关键点需要注意输入格式中每个结点的左右孩子是用字符-表示的这意味着我们需要处理字符到数字的转换。另外题目给出的结点编号是从0开始的连续整数这提示我们可以用静态数组来存储树结构既节省空间又方便查找。在实际解题时我总结出三个关键步骤从输入数据中找到根节点根据输入数据构建二叉树使用层次遍历找出所有叶结点这种分步解决的方法把一个大问题拆解成几个小问题每个小问题都有明确的解决思路大大降低了编码难度。这也是我在数据结构学习中总结出的重要经验——化整为零逐个击破。2. 静态数组存储与根节点查找技巧在处理树的输入数据时我发现一个很实用的技巧用标记数组找根节点。因为除了根节点外其他所有节点都会作为某个节点的孩子出现。基于这个观察我们可以创建一个长度为N的标记数组初始值全为0。具体实现时我遍历每个节点的左右孩子如果孩子存在不是-就把对应下标的标记数组位置设为1。最后标记数组中仍为0的位置就是根节点的编号。这个方法的时间复杂度是O(N)非常高效。int FindHead(ThreeArr TArr[], int n) { if (n 1) return 0; int Arr[n]; for(int i 0; i n; i) { Arr[i] 0; } for(int i 0; i n; i) { if(TArr[i].LNode ! -) { Arr[TArr[i].LNode-0] 1; } if(TArr[i].RNode ! -) { Arr[TArr[i].RNode-0] 1; } } for(int i 0; i n; i) { if(Arr[i] 0) { return i; } } return -1; // 理论上不会执行到这里 }这里有个细节需要注意字符0到9的ASCII码是连续的所以可以用child-0的方式将字符转换为数字。这个小技巧在处理字符型数字输入时非常实用。3. 递归构建二叉树找到根节点后接下来就是构建二叉树。我采用了递归方法因为递归的思路最符合树结构的本质特性。每个节点的构建过程都是相同的创建节点然后递归创建其左右子树。TreeNode *BuildTree(int head, ThreeArr TArr[]) { TreeNode *T (TreeNode *)malloc(sizeof(TreeNode)); T-val head; T-right T-left NULL; if(TArr[head].LNode ! -) T-left BuildTree(TArr[head].LNode - 0, TArr); if(TArr[head].RNode ! -) T-right BuildTree(TArr[head].RNode - 0, TArr); return T; }在实际编码时我犯过一个错误忘记处理孩子为-的情况导致程序访问非法内存。这个教训让我明白边界条件的检查在树结构操作中尤为重要。递归虽然简洁但必须确保有明确的终止条件否则很容易导致栈溢出。4. 层次遍历实现与叶结点判断题目要求按从上到下、从左到右的顺序输出叶结点这正是**层次遍历BFS**的典型应用。与深度优先搜索DFS不同BFS需要使用队列来辅助实现。我的实现思路是将根节点入队循环直到队列为空出队一个节点检查是否是叶结点左右孩子都为空将非空左右孩子入队void LevelOrder(TreeNode *T) { int flag 0; if(T) { TreeNode *queue[100]; int left 0, right 0; queue[right] T; while (left right) { TreeNode *bt queue[left]; if(bt-left NULL bt-right NULL) { if(flag 0) { printf(%d, bt-val); flag; } else { printf( %d, bt-val); } } if(bt-left) queue[right] bt-left; if(bt-right) queue[right] bt-right; } } }这里有个输出格式的小技巧使用flag变量控制空格的输出确保第一个数字前和最后一个数字后没有多余空格。这种细节处理在PTA等在线评测系统中非常重要可能决定你的代码是否能通过所有测试用例。5. 完整代码实现与测试将上述各个部分组合起来就得到了完整的解决方案。为了验证代码的正确性我用题目给出的样例进行了测试输入8 1 - - - 0 - 2 7 - - - - 5 - 4 6输出4 1 5这个结果与题目给出的样例输出一致说明我们的实现是正确的。完整的代码如下#include stdio.h #include stdlib.h typedef struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; } TreeNode; typedef struct ThreeArr { char LNode; char RNode; } ThreeArr; int FindHead(ThreeArr TArr[], int n) { if (n 1) return 0; int Arr[n]; for(int i 0; i n; i) { Arr[i] 0; } for(int i 0; i n; i) { if(TArr[i].LNode ! -) { Arr[TArr[i].LNode-0] 1; } if(TArr[i].RNode ! -) { Arr[TArr[i].RNode-0] 1; } } for(int i 0; i n; i) { if(Arr[i] 0) { return i; } } return -1; } TreeNode *BuildTree(int head, ThreeArr TArr[]) { TreeNode *T (TreeNode *)malloc(sizeof(TreeNode)); T-val head; T-right T-left NULL; if(TArr[head].LNode ! -) T-left BuildTree(TArr[head].LNode - 0, TArr); if(TArr[head].RNode ! -) T-right BuildTree(TArr[head].RNode - 0, TArr); return T; } void LevelOrder(TreeNode *T) { int flag 0; if(T) { TreeNode *queue[100]; int left 0, right 0; queue[right] T; while (left right) { TreeNode *bt queue[left]; if(bt-left NULL bt-right NULL) { if(flag 0) { printf(%d, bt-val); flag; } else { printf( %d, bt-val); } } if(bt-left) queue[right] bt-left; if(bt-right) queue[right] bt-right; } } } int main() { int n; scanf(%d, n); getchar(); ThreeArr ta[n]; for(int i 0; i n; i) { scanf(%c %c, ta[i].LNode, ta[i].RNode); getchar(); } int head FindHead(ta, n); TreeNode *Tree BuildTree(head, ta); LevelOrder(Tree); return 0; }在实际编码过程中我发现有几个常见错误需要注意忘记释放动态分配的内存虽然在这个简单程序中影响不大数组越界访问特别是在处理字符到数字转换时输入处理时忘记用getchar()吸收换行符6. 算法优化与扩展思考虽然这个解法已经能够很好地解决问题但我们还可以进一步思考可能的优化空间。例如是否可以不用构建完整的二叉树结构直接在输入数据上进行层次遍历经过分析我认为是可行的。我们可以维护一个队列存储待处理的节点编号然后直接从输入数组中查找其左右孩子。这种方法可以节省构建树结构的时间和空间但代码可读性可能会降低。另一个值得思考的问题是如果树非常大比如节点数超过10^5我们的静态数组队列可能不够用。这时应该改用动态扩容的队列或者使用链表实现的队列。在实际工程项目中我们还需要考虑更多的边界情况比如空树的处理所有节点都是叶结点的情况输入数据不合法的情况如形成环这些问题虽然在这个PTA题目中没有出现但在实际开发中都需要考虑周全。这也是算法题目和实际工程问题的一个重要区别。

相关文章:

PTA数据结构实战:层次遍历巧解二叉树叶结点输出

1. 从问题理解到解题思路 第一次看到PTA上这道二叉树题目时,我也被题目描述唬住了。题目要求按从上到下、从左到右的顺序输出所有叶结点,这不就是典型的层次遍历(BFS)应用场景吗?但仔细分析输入格式后,我发…...

从自动化到智能代理:构建家庭智能中枢的架构与实践

1. 项目概述与核心价值最近在折腾智能家居和自动化流程,发现市面上的很多方案要么太“重”,需要依赖特定品牌的生态闭环;要么太“散”,各种工具和脚本堆在一起,管理起来一团乱麻。直到我遇到了一个名为“Home-agent-as…...

ESP32-C3驱动2寸ST7789屏幕?手把手教你搞定LVGL移植(附避坑代码)

ESP32-C3与ST7789屏幕的LVGL移植实战指南 在物联网设备开发中,显示交互界面往往是提升用户体验的关键一环。ESP32-C3作为乐鑫推出的高性价比RISC-V芯片,搭配ST7789驱动的2寸LCD屏幕,能够构建出性能稳定、成本可控的嵌入式显示方案。本文将带你…...

AI Agent Harness多模型融合管控

AI Agent Harness实战:从0到1搭建企业级多模型融合管控系统 副标题:兼容OpenAI/Claude/Llama3/通义千问,解决多模型调度、能力互补、成本管控、一致性校验核心痛点 摘要/引言 大家好,我是专注大模型应用落地的资深架构师老周,最近半年帮3家不同行业的企业落地了多模型Ag…...

Cursor编辑器自动化实践:利用Sisyphus脚本解放重复开发任务

1. 项目概述与核心价值最近在GitHub上看到一个挺有意思的项目,叫Fguedes90/cursor-sisyphus。乍一看这个标题,可能会有点摸不着头脑,但如果你是一个深度使用Cursor AI代码编辑器的开发者,或者对AI辅助编程的自动化流程感兴趣&…...

音乐解锁实战:如何让网易云音乐的加密文件在任意设备自由播放

音乐解锁实战:如何让网易云音乐的加密文件在任意设备自由播放 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 你是否曾经在网易云音乐下载了心爱的歌曲,却发现只能在特定客户端播放,无法在车载音响…...

ParsecVDisplay终极指南:解锁Windows虚拟显示器完整解析

ParsecVDisplay终极指南:解锁Windows虚拟显示器完整解析 【免费下载链接】parsec-vdd ✨ Perfect virtual display for game streaming 项目地址: https://gitcode.com/gh_mirrors/pa/parsec-vdd 你是否曾渴望拥有额外的屏幕空间,却受限于物理显示…...

Neovim AI编程助手codecompanion.nvim:无缝集成与高效开发实践

1. 项目概述:一个为Neovim而生的AI编程伴侣如果你和我一样,是个深度依赖Neovim进行日常开发的程序员,那么你一定经历过这样的时刻:面对一段复杂的逻辑,需要反复查阅文档;或者写一个函数时,卡在某…...

3分钟掌握网页视频下载:Chrome扩展VideoDownloadHelper完全指南

3分钟掌握网页视频下载:Chrome扩展VideoDownloadHelper完全指南 【免费下载链接】VideoDownloadHelper Chrome Extension to Help Download Video for Some Video Sites. 项目地址: https://gitcode.com/gh_mirrors/vi/VideoDownloadHelper 你是否曾经遇到想…...

别再手动改路由了!用Ant Design Vue的Menu组件动态生成“顶一左多”级导航菜单

基于Ant Design Vue的声明式导航菜单架构设计 在复杂后台管理系统开发中,导航菜单的动态生成与权限控制一直是架构设计的难点。传统方案往往需要在多个组件中硬编码菜单结构,导致维护成本高、权限同步困难。本文将介绍如何利用Ant Design Vue的Menu组件与…...

Git多用户代理架构解析:实现细粒度权限管理与统一访问入口

1. 项目概述:从单兵作战到团队协作的代码管理跃迁如果你是一个独立开发者,或者在一个小团队里,你可能习惯了把代码往GitHub、Gitee这样的平台上一扔,设置个私有仓库,然后通过个人账号的SSH密钥来管理访问权限。这种方式…...

基于RP2040与NeoPixel的交互式LED气泡桌:硬件选型、电路设计与动画编程全解析

1. 项目概述:打造一个会呼吸的光影气泡桌 几年前,我在一个艺术展上看到一个用灯光和烟雾营造氛围的装置,当时就被那种动态光影与物理形态结合的美感深深吸引。作为一个喜欢动手的嵌入式开发者,我一直在想,能不能做一个…...

告别点灯:用GC9A01圆形屏为你的Arduino/ESP32项目做个酷炫UI(附完整代码)

告别点灯:用GC9A01圆形屏为你的Arduino/ESP32项目做个酷炫UI(附完整代码) 在智能硬件项目中,一个精致的用户界面往往能大幅提升产品质感。GC9A01这款1.28英寸圆形TFT屏幕,以其240x240的高分辨率和IPS面板的广视角特性…...

3个技巧让LaTeX参考文献自动符合GB/T 7714国标:告别手动排版烦恼

3个技巧让LaTeX参考文献自动符合GB/T 7714国标:告别手动排版烦恼 【免费下载链接】gbt7714-bibtex-style BibTeX styles for Chinese National Standard GB/T 7714 项目地址: https://gitcode.com/gh_mirrors/gb/gbt7714-bibtex-style 还在为毕业论文、学术论…...

ARM GIC中断控制器架构与寄存器编程详解

1. ARM GIC中断控制器架构概述 中断控制器是现代处理器系统中至关重要的组件,它负责协调和管理来自各种外设的中断请求。ARM架构的通用中断控制器(GIC)经过多代演进,目前GICv3/GICv4已成为主流实现。GIC的核心功能包括中断优先级管理、中断分发、虚拟化支…...

ARM Cortex-A9 MPCore多核处理器架构与优化实践

1. ARM Cortex-A9 MPCore硬件架构概述ARM Cortex-A9 MPCore是一款广泛应用于嵌入式系统的高性能多核处理器。作为ARMv7-A架构的代表性产品,它在工业控制、汽车电子和消费电子等领域有着广泛应用。这款处理器最显著的特点是支持1-4个核心的对称多处理(SMP)配置&#…...

Windows 10系统瘦身实战:用Win10BloatRemover打造高效纯净系统

Windows 10系统瘦身实战:用Win10BloatRemover打造高效纯净系统 【免费下载链接】Win10BloatRemover Configurable CLI tool to easily and aggressively debloat and tweak Windows 10 by removing preinstalled UWP apps, services and more. Originally based on …...

树与二叉树:数据结构核心解析

引言在前面的文章中,我们已经系统学习了线性数据结构——链表、栈、队列。线性结构的特点是元素之间存在一对一的先后关系。然而,现实世界中的很多数据关系是一对多的:文件系统中的目录与子目录、公司的组织架构、网页的 DOM 结构……树&…...

告别‘鬼影’与模糊:深入解读RangeNet++如何用高效kNN后处理搞定LiDAR语义分割的边界难题

RangeNet:用GPU加速的kNN后处理破解LiDAR语义分割的边界模糊难题 当自动驾驶车辆以每小时60公里的速度行驶时,每100毫秒的决策延迟意味着1.67米的盲区——这恰好是许多交通事故发生的临界距离。在LiDAR语义分割领域,传统方法在点云投影与反投…...

基于LLM智能体编排框架call-agents-help的实战指南

1. 项目概述与核心价值最近在GitHub上看到一个挺有意思的项目,叫heyuqiu2023/call-agents-help。光看名字,你可能会有点摸不着头脑,这“呼叫代理助手”到底是个啥?其实,这是一个围绕大语言模型(LLM&#xf…...

星露谷物语SMAPI终极指南:5分钟解锁无限模组世界

星露谷物语SMAPI终极指南:5分钟解锁无限模组世界 【免费下载链接】SMAPI The modding API for Stardew Valley. 项目地址: https://gitcode.com/gh_mirrors/smap/SMAPI 你是否曾梦想过让星露谷物语变得更加精彩?想象一下:当你辛苦耕种…...

Transformer架构与混合专家系统(MoE)的技术演进与应用

1. Transformer架构与混合专家系统(MoE)的演进之路2017年,Transformer架构的横空出世彻底改变了自然语言处理的游戏规则。这种基于自注意力机制的架构不仅在各种序列建模任务中展现出惊人性能,更为后续的大规模语言模型奠定了坚实基础。然而,…...

终极指南:如何用Reset-Windows-Update-Tool快速修复Windows更新故障

终极指南:如何用Reset-Windows-Update-Tool快速修复Windows更新故障 【免费下载链接】Reset-Windows-Update-Tool Troubleshooting Tool with Windows Updates (Developed in Dev-C). 项目地址: https://gitcode.com/gh_mirrors/re/Reset-Windows-Update-Tool …...

从入门到精通:trtexec命令行工具在TensorRT模型部署中的实战指南

1. trtexec工具基础入门 第一次接触trtexec时,我也被这个命令行工具的参数数量吓到了。但实际用下来发现,它就像瑞士军刀一样,虽然功能多但每个都很实用。trtexec是TensorRT安装包自带的命令行工具,主要用来做三件事:…...

.NET逆向工程新选择:dnSpyEx调试器与程序集编辑全解析

.NET逆向工程新选择:dnSpyEx调试器与程序集编辑全解析 【免费下载链接】dnSpy Unofficial revival of the well known .NET debugger and assembly editor, dnSpy 项目地址: https://gitcode.com/gh_mirrors/dns/dnSpy 你是否曾面对一个没有源代码的.NET程序…...

终极指南:Diablo Edit2暗黑破坏神2存档修改器完整使用教程

终极指南:Diablo Edit2暗黑破坏神2存档修改器完整使用教程 【免费下载链接】diablo_edit Diablo II Character editor. 项目地址: https://gitcode.com/gh_mirrors/di/diablo_edit 你是否曾为暗黑破坏神2中重复刷装备而烦恼?是否因为技能点分配失…...

code2prompt:AI编程助手的高效代码上下文生成工具详解

1. 项目概述:从代码到提示词的“翻译官”最近在折腾一些AI辅助编程或者代码分析的工具时,我经常遇到一个头疼的问题:如何把我手头的一大段项目代码,高效、准确地“喂”给像ChatGPT、Claude或者GitHub Copilot这样的AI助手&#xf…...

自动驾驶系统商业化策略:硬件与软件协同设计解析

1. 自动驾驶系统的商业策略框架解析自动驾驶系统(Autonomous Driving System, ADS)作为智能交通领域的核心技术,其商业化落地需要硬件(SSH)与软件策略的协同设计。从技术架构来看,ADS由感知层、决策层和执行…...

保姆级教程:用PyTorch复现DLA-34分割模型(含可变形卷积版DLAseg)

深度解析DLA-34分割模型:从理论到PyTorch实战 在计算机视觉领域,特征融合一直是提升模型性能的关键技术。Deep Layer Aggregation(DLA)作为CVPR 2018提出的创新架构,通过独特的树状连接机制实现了跨层级的深度特征融合…...

SQL数据库如何实现数据的逻辑删除_利用状态位与查询过滤

逻辑删除应使用UPDATE修改状态字段而非DELETE物理删除,因后者导致数据不可恢复、审计困难、关联断裂;须全局统一过滤status1,建索引、用视图/ORM作用域、冗余状态列保障一致性。为什么不能直接用 DELETE 语句删数据逻辑删除本质是“假装删了”…...