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

【数据结构与算法】 二叉树做题

洛谷P8681完全二叉树按层求权值和最大深度问题完全二叉树就像电影院座位第一排坐满第二排坐满第三排从左到右连续坐人不留空位书本排版每一行都排满文字最后一行可能不满但文字都是从左开始不是完全二叉树就像电影院座位第一排坐满第二排坐满第三排中间空一个座位才坐人满二叉树 vs 完全二叉树对比表格特性满二叉树完全二叉树定义所有层都满每个节点都有两个孩子除了叶子最后一层可以不满但必须靠左连续形状完美的三角形可能缺右下角节点数固定2^h - 1h为高度范围2^(h-1) 到 2^h - 1叶子位置都在同一层只在最后两层严格程度最严格相对宽松最近在做一道关于完全二叉树的小题题目本身不复杂但挺适合用来巩固对二叉树层序结构的理解。这里简单整理一下思路和实现过程写成一篇小总结。题目给定一个包含 N 个节点的完全二叉树并且节点是按照从上到下、从左到右的顺序给出的也就是典型的“层序存储”。我们需要做的是把相同深度的节点权值加起来找出权值和最大的那一层如果有多层相同则输出最小的深度。一开始看到“完全二叉树 顺序存储”其实就应该想到一个关键点不需要真的去建树。因为数组本身已经隐含了层序结构。对于完全二叉树来说每一层的节点数量是有规律的第 1 层1 个节点第 2 层2 个节点第 3 层4 个节点第 k 层2^(k-1) 个节点也就是说我们可以直接按照这个规律在数组中“分段”处理。核心思路其实很简单用一个指针 start 表示当前层的起始位置用 depth 表示当前是第几层。每一层的节点个数是 2^(depth-1)然后从数组中取出这一段求和更新最大值即可。代码如下#includeiostream #includevector #includealgorithm using namespace std; vectorint arr; int n; int main() { cin n; arr.resize(n 5); for (int i 1; i n; i) cin arr[i]; int ans 0; // 当前最大权值和 int endans; // 对应的深度 int start 1; // 当前层起始位置 int depth 1; // 当前深度 while (start n) { int nowsum 1 (depth - 1); // 当前层节点数 int sum 0; for (int i start; i start nowsum i n; i) { sum arr[i]; } if (sum ans) { ans sum; endans depth; } start nowsum; depth; } cout endans endl; return 0; }这里有几个细节值得注意一下。首先是1 (depth - 1)这个是用位运算来计算 2 的幂比用pow更高效也更常见。其次是循环里的边界控制i n。因为最后一层不一定是满的所以要防止越界。还有一个点是 start 的更新每处理完一层就直接跳到下一层的起始位置这样整体时间复杂度就是 O(N)。整体来看这道题的关键不是二叉树本身而是“如何利用完全二叉树的结构特性把问题转化为数组分段处理”。一旦想到这一点实现就会变得很直接。这类题目在算法题中很常见尤其是在不需要真的建树的时候多考虑一下“下标和结构的关系”往往能让问题简单很多。洛谷P4715淘汰赛求亚军问题的一种递归解法这道题是一个比较典型的模拟淘汰赛过程的题目。给定 (2^n) 个国家每个国家都有一个能力值并且两两对决能力强的胜出最终决出冠军。题目要求输出的是“亚军”的编号。一开始看到这种题很多人可能会想着用循环一轮一轮模拟比赛其实这样也可以做。但这道题有一个更自然的解法就是用递归去还原整个比赛过程本质上就是一棵“比赛树”。可以这样理解整个淘汰赛就是一棵二叉树每一场比赛都是一个节点左右子树分别代表两个子赛区的结果而当前节点就是这两个子赛区冠军之间的对决。因此我们可以定义一个函数在区间 ([l, r]) 内返回这一段选手的“冠军”。递归的思路非常直接如果区间里只有一个人那么他就是冠军否则就把区间分成左右两部分分别求出左半区冠军和右半区冠军然后比较两者能力值返回更强的那一个。代码实现如下#include iostream #include vector #include cmath using namespace std; struct Team { int id; int ability; }; // 返回区间 [l, r] 的冠军 Team find_champion(vectorint ability, int l, int r) { if (l r) { return {l, ability[l]}; } int mid (l r) / 2; Team left find_champion(ability, l, mid); Team right find_champion(ability, mid 1, r); if (left.ability right.ability) { return left; } else { return right; } } int main() { int n; cin n; int m 1 n; vectorint ability(m 1); for (int i 1; i m; i) { cin ability[i]; } // 左右半区冠军 Team left_champion find_champion(ability, 1, m / 2); Team right_champion find_champion(ability, m / 2 1, m); // 亚军就是最终决赛输掉的人 if (left_champion.ability right_champion.ability) { cout left_champion.id endl; } else { cout right_champion.id endl; } return 0; }这里有一个关键点需要理解清楚为什么最后只需要比较“左右半区冠军”就能得到亚军因为淘汰赛的结构决定了最终的冠军一定是全场最强的那个选手而亚军一定是在“决赛”中输给冠军的人。也就是说亚军只可能出现在另一个半区的冠军里而不可能是更早被淘汰的人。所以我们不需要关心整个比赛过程中每一轮的失败者只需要找到左右两边的“最强者”然后取较小的那个就是答案。这道题的核心其实不在递归本身而是在于把“淘汰赛”抽象成一棵二叉树结构。一旦有这个思路代码就会变得很清晰。另外还有一个可以优化的小点find_champion里的vectorint ability是值传递其实可以改成引用传递避免不必要的拷贝这在数据量更大时会更高效。整体来说这是一道很适合练习“递归建模”的题把过程问题转化成结构问题是算法题里一个很重要的思路。

相关文章:

【数据结构与算法】 二叉树做题

洛谷P8681完全二叉树按层求权值和最大深度问题完全二叉树就像:电影院座位:第一排坐满,第二排坐满,第三排从左到右连续坐人,不留空位书本排版:每一行都排满文字,最后一行可能不满,但文…...

ESP8266数传模块实战:5分钟搞定PX4飞控的WIFI连接(附固件下载)

ESP8266数传模块实战:5分钟搞定PX4飞控的WIFI连接(附固件下载) 在无人机开发领域,快速搭建可靠的通信链路是每个开发者必须掌握的技能。ESP8266作为一款高性价比的WIFI模块,与PX4飞控的结合为开发者提供了轻量级的数传…...

金仓数据库在MySQL迁移中的技术观察:三层兼容机制与平滑替换路径复盘

金仓数据库在MySQL迁移中的技术观察:三层兼容机制与平滑替换路径复盘 在信息技术应用创新持续深化的背景下,业务系统建设单位普遍关注一个核心问题:“更换数据库,需要修改多少代码?是否影响业务连续性?系统…...

金仓数据库在MySQL迁移中的实践总结:成本优化与适配周期控制的技术路径复盘

金仓数据库在银行存取记录MySQL迁移中的技术观察:典型适配挑战与应对思路复盘 作为银行核心系统运维或数据库迁移工程师,你是否经历过这样的深夜——上线窗口只剩90分钟,金仓数据库(KingbaseES)MySQL兼容模式测试看似…...

从8跳到3跳:EVPN 分布式网关让时延降低67%的完整实战

众里寻他千百度,蓦然回首,那网关却在,灯火阑珊处。经过几次实验,我们用BGP Unnumbered实现了Underlay网络的搭建(告别OSPF!EVE-NG专业版BGP Unnumbered打通Underlay的完整实战),用BF…...

解锁自然语言编程:Open Interpreter本地代码执行完整指南

解锁自然语言编程:Open Interpreter本地代码执行完整指南 【免费下载链接】open-interpreter 项目地址: https://gitcode.com/GitHub_Trending/ope/open-interpreter Open Interpreter是一款革命性的开源工具,它允许开发者通过自然语言与本地代码…...

面向隐私合规的人脸检测方案:MogFace纯本地运行杜绝数据上传风险

面向隐私合规的人脸检测方案:MogFace纯本地运行杜绝数据上传风险 在需要处理人脸图像的场景里,比如统计合影人数、安防监控分析或者内容审核,一个绕不开的核心问题就是:数据隐私。把包含人脸的图片上传到云端服务器,总…...

MATLAB实战:5步搞定心电图信号去噪(附完整代码与避坑指南)

MATLAB实战:5步搞定心电图信号去噪(附完整代码与避坑指南) 心电图信号分析是生物医学工程领域的经典课题,但原始ECG数据往往混杂着肌电干扰、基线漂移和工频噪声。本文将手把手教你用MATLAB实现专业级去噪效果,从数据导…...

生成式AI助力无线视觉系统透视遮挡物体技术突破

麻省理工学院的研究人员经过十多年的研究,开发出了一套能够让机器人通过"透视"障碍物来发现和操作隐藏物体的技术。该技术利用能够穿透表面的无线信号,这些信号会从隐藏的物体上反射回来。现在,研究人员正在利用生成式人工智能模型…...

深入解析Java中的hashCode与equals方法:从理论到应用

在Java编程中,hashCode()和equals()方法是非常重要的,它们被广泛应用于对象比较和哈希表等数据结构中。这两个方法之间存在着紧密的联系,了解它们的工作原理和用法对于掌握Java编程至关重要。01重要方法概述◉ hashCode与equals简介在Java编程…...

利用快马平台快速构建openclaw安卓自动化工具原型

最近在尝试做一个安卓端的自动化工具,类似openclaw这样的应用。我的想法是,先快速做出一个能验证核心概念的原型,看看功能逻辑是否跑得通,而不是一开始就陷入复杂的架构和UI细节里。这个过程,我用到了一个非常顺手的在…...

**发散创新:用函数式思维重构不可变设施的配置管理**在现代分布式系统中,**不可变基础设施

发散创新:用函数式思维重构不可变设施的配置管理 在现代分布式系统中,不可变基础设施(Immutable Infrastructure) 已成为云原生架构的核心实践之一。它强调通过版本化、自动化的方式部署和更新环境,避免手动修改运行中…...

Nanbeige 4.1-3B 嵌入式开发辅助:基于STM32项目生成C语言驱动代码

Nanbeige 4.1-3B 嵌入式开发辅助:基于STM32项目生成C语言驱动代码 你是不是也经历过这样的时刻?面对一块崭新的STM32开发板,想要接上一个I2C温湿度传感器,却不得不花上半天甚至一天的时间,去翻阅数据手册、查找HAL库函…...

SVG格式转换全攻略:从基础操作到自动化流程

SVG格式转换全攻略:从基础操作到自动化流程 【免费下载链接】logos A huge collection of SVG logos 项目地址: https://gitcode.com/gh_mirrors/lo/logos 在数字设计与开发领域,SVG(可缩放矢量图形)凭借其无限缩放不失真的…...

SiamRPN++实战:用ResNet-50打造高精度目标跟踪器(附代码详解)

SiamRPN实战:用ResNet-50打造高精度目标跟踪器(附代码详解) 在计算机视觉领域,目标跟踪技术正经历着从传统方法到深度学习驱动的革命性转变。当我们面对复杂场景中的快速运动目标、遮挡干扰或光照变化时,基于深度学习的…...

# 发散创新:用TensorFlow构建动态图神经网络实现社交关系预测在深度学习飞速发展的今天

发散创新:用TensorFlow构建动态图神经网络实现社交关系预测 在深度学习飞速发展的今天,TensorFlow 不仅是模型训练的利器,更是复杂数据结构建模的强大工具。本文将带你深入一个前沿方向——基于动态图神经网络(Dynamic GNN&#x…...

GanttProject 项目管理神器:5步告别混乱,让团队协作效率提升300%

GanttProject 项目管理神器:5步告别混乱,让团队协作效率提升300% 【免费下载链接】ganttproject Official GanttProject repository 项目地址: https://gitcode.com/gh_mirrors/ga/ganttproject 你是否曾为项目管理中的这些痛点而烦恼&#xff1f…...

Matlab综合能源系统优化代码:光热电站与ORC建模求解及9节点电网等多网仿真分析

Matlab综合能源系统优化代码 考虑光热电站(CSP电站)和ORC的综合能源系统优化的建模求解 程序中包含了新能源发电、ORC循环等,以运行成本、碳排放成本、弃风弃光惩罚成本等为目标函数,基于9节点电网、6节点气网、8节点热网、4节点冷…...

智能编码伙伴:如何用快马AI增强你的Texstudio写作体验与问题解决能力

作为一名长期使用LaTeX撰写技术文档的用户,我深刻体会到在Texstudio中遇到复杂排版需求时的困扰。最近尝试了InsCode(快马)平台的AI辅助功能,发现它能显著提升LaTeX写作效率。以下是我的真实使用场景记录: 神经网络绘图方案选择 当需要绘制CN…...

基于MATLAB的储能优化配置策略应对风电并网调峰需求与灵活性供需不确定性挑战

MATLAB代码:考虑灵活性供需不确定性的储能参与电网调峰优化配置 关键词:储能优化配置 电网调峰 风电场景生成 灵活性供需不确定性 参考文档:《考虑灵活性供需不确定性的储能优化配置》复现其上层模型,下层模型未实现 仿真平台&am…...

LongCat-Image-Edit在Java开发中的应用:动物形象智能生成系统

LongCat-Image-Edit在Java开发中的应用:动物形象智能生成系统 1. 引言 游戏开发者和动漫设计师们经常面临一个共同的挑战:如何快速生成多样化、高质量的动物角色形象?传统的手工设计方式不仅耗时耗力,而且很难保证创意的新颖性和…...

新手必看!PyTorch-2.x-Universal-Dev-v1.0快速上手指南,从安装到运行

新手必看!PyTorch-2.x-Universal-Dev-v1.0快速上手指南,从安装到运行 1. 引言:为什么选择这个镜像? 如果你正在寻找一个开箱即用的PyTorch开发环境,PyTorch-2.x-Universal-Dev-v1.0镜像可能是你的理想选择。这个镜像…...

Win11安装必备:绕过TPM校验的3种方法(含最新2023实测有效方案)

Win11安装实战指南:无TPM设备的三种系统部署方案 每次Windows重大版本更新都会引发硬件兼容性讨论,Win11的TPM 2.0要求让许多性能完好的老设备陷入尴尬境地。作为长期从事系统部署的技术顾问,我见证了从最初修改注册表到如今成熟的绕过方案演…...

Depth Anything V2环境配置避坑指南:从numpy版本到xFormers适配全解析

Depth Anything V2环境配置避坑指南:从numpy版本到xFormers适配全解析 最近在配置Depth Anything V2环境时,我发现不少开发者都在重复踩同样的坑。作为一个刚趟过这趟浑水的人,我想分享一些实战经验,帮助大家少走弯路。Depth Anyt…...

【Dify生产环境Rerank避坑白皮书】:92%开发者忽略的reranker_model配置陷阱及3步热修复法

第一章:Dify生产环境Rerank报错的典型现象与影响评估在Dify v0.12.0生产部署中,Rerank模块(尤其启用BGE-Reranker或Cohere Rerank API时)频繁出现HTTP 500或超时中断,伴随日志中重复输出rerank_service: failed to cal…...

UM2 3D 打印机 DIY 进阶:LCD12864 显示驱动与固件优化全攻略

1. LCD12864 显示屏基础认知与选型指南 第一次接触UM2 3D打印机DIY时,我被这块巴掌大的液晶屏难住了。LCD12864看似简单,实际藏着不少门道。市面上常见的两种控制器板——RepRapDiscount Full Graphic Smart Controller和RepRapDiscount Smart Controlle…...

Linux 的 chroot 命令

Linux 的 chroot 命令详解 基本概念 chroot(Change Root)是 Linux 系统中的一个重要命令,用于将当前进程及其子进程的根目录更改为指定的目录。这个命令名称来源于"change root directory"的缩写。 工作原理 当执行 chroot 命令…...

手把手重构你的评估流水线:用Dify替代人工标注——3天上线、误差率↓68%、ROI 23.7倍的实战路径

第一章:手把手重构你的评估流水线:用Dify替代人工标注——3天上线、误差率↓68%、ROI 23.7倍的实战路径传统NLP评估依赖人工标注,平均耗时14人日/任务,单次标注一致性仅72.3%,且难以复现。我们通过将人工标注流水线迁移…...

【Frida Android】实战篇:Java层Hook进阶——拦截与篡改普通方法参数

1. 从基础到进阶:为什么需要拦截方法参数? 在之前的Frida基础教程中,我们已经学会了如何Hook普通方法并修改其返回值。但实际逆向工程中,仅仅修改返回值往往不够——我们需要更深入地干预方法的执行流程,而拦截并篡改方…...

Mermaid Subgraph避坑指南:如何避免在绘制流程图时常见的布局混乱问题

Mermaid Subgraph避坑指南:如何避免在绘制流程图时常见的布局混乱问题 在技术文档和系统架构设计中,流程图是传达复杂逻辑关系的利器。而Mermaid作为一款基于文本的图表工具,因其易用性和版本控制的友好性,已成为开发者绘制流程图…...