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

[特殊字符]【LeetCode 106】从中序与后序遍历构造二叉树(C语言详解|递归+区间划分)

一、题目描述给定两个数组inorder中序遍历左 → 根 → 右postorder后序遍历左 → 右 → 根要求构造并返回这棵二叉树 示例输入 inorder [9,3,15,20,7] postorder [9,15,7,20,3] 输出 3 / \ 9 20 / \ 15 7 二、核心思路这题本质就是✅利用遍历特性还原树结构⭐ 关键观察1️⃣ 后序遍历 → 找根节点后序左 → 右 → 根最后一个元素一定是根节点root postorder[postR];2️⃣ 中序遍历 → 分割左右子树中序左 → 根 → 右找到 root 在 inorder 中的位置k[inL ...... k-1] k [k1 ...... inR] 左子树 根 右子树3️⃣ 如何切分 postorder核心难点设leftSize k - inL那么子树inorder 区间postorder 区间左子树[inL, k-1][postL, postL leftSize - 1]右子树[k1, inR][postL leftSize, postR - 1]✍️ 三、递归解法C语言实现✅ 完整代码#include stdlib.h // 二叉树结构定义 struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; }; // 查找 root 在 inorder 中的位置 int findIndex(int* inorder, int inL, int inR, int val) { for (int i inL; i inR; i) { if (inorder[i] val) return i; } return -1; } // 构建函数 struct TreeNode* build( int* inorder, int inL, int inR, int* postorder, int postL, int postR ) { // 终止条件 if (inL inR) return NULL; // 1️⃣ 根节点 int rootVal postorder[postR]; struct TreeNode* root (struct TreeNode*)malloc(sizeof(struct TreeNode)); root-val rootVal; root-left root-right NULL; // 2️⃣ 在 inorder 找位置 int k findIndex(inorder, inL, inR, rootVal); // 3️⃣ 左子树大小 int leftSize k - inL; // 4️⃣ 递归构建 root-left build(inorder, inL, k - 1, postorder, postL, postL leftSize - 1); root-right build(inorder, k 1, inR, postorder, postL leftSize, postR - 1); return root; } // 主函数 struct TreeNode* buildTree(int* inorder, int inorderSize, int* postorder, int postorderSize) { return build(inorder, 0, inorderSize - 1, postorder, 0, postorderSize - 1); } 四、复杂度分析❌ 当前实现查找 rootO(n)总体复杂度O(n^2) 优化推荐面试说使用哈希表记录 inorder 下标value - index 查找变 O(1)✅ 优化后复杂度时间复杂度O(n) 空间复杂度O(n)⚠️ 五、常见错误总结❌ 错误 1把 postorder[0] 当根 根在最后一个❌ 错误 2区间乱写 强烈建议统一全部使用左闭右闭 [L, R]❌ 错误 3右子树没减 1postR - 1 // 很多人忘❌ 错误 4leftSize 写错leftSize k - inL; // 必须这样 六、和 105 题的关系面试重点题目根节点位置前序 中序preorder[preL]中序 后序postorder[postR] 一句话模板前序定头后序定尾中序划分左右子树 七、总结这类题的本质只有三步确定根节点前序头 / 后序尾在中序中定位根按长度切分左右子树如果你准备面试这题建议做到✅ 能手写递归版本✅ 能口述区间划分✅ 能说出 O(n) 优化

相关文章:

[特殊字符]【LeetCode 106】从中序与后序遍历构造二叉树(C语言详解|递归+区间划分)

📌 一、题目描述给定两个数组:inorder:中序遍历(左 → 根 → 右)postorder:后序遍历(左 → 右 → 根)要求:构造并返回这棵二叉树🔹 示例输入: ino…...

给匿名无人机加个“大脑”:树莓派扩展平台从建模到安装实战

给匿名无人机加个“大脑”:树莓派扩展平台从建模到安装实战 当无人机从简单的飞行玩具进化成具备自主决策能力的智能设备时,硬件扩展平台的设计就成为了关键。本文将带您深入探索如何为匿名飞控无人机打造一个专业的树莓派扩展系统,从3D建模到…...

Verilog测试bench实战:用Modelsim快速验证与门逻辑(含$random函数详解)

Verilog测试bench实战:用Modelsim快速验证与门逻辑(含$random函数详解) 在FPGA开发流程中,功能验证往往占据70%以上的时间成本。如何构建高效的验证环境,成为工程师提升生产力的关键突破口。本文将带您从零搭建一个完整…...

基于STM32F103C8T6与HX711的称重系统实战:从零搭建到数据校准

1. 硬件选型与电路连接 第一次接触称重系统开发时,最让我头疼的就是硬件选型。市面上各种型号的称重传感器和ADC芯片让人眼花缭乱,经过多次踩坑后,我发现STM32F103C8T6HX711这个组合特别适合新手入门。STM32F103C8T6作为经典的Cortex-M3内核M…...

Harmonyos应用实例165:中心对称图案设计

应用实例五:中心对称图案设计 知识点:第二十三章《旋转》—— 中心对称。 功能:一个画板,学生在左侧随意绘制图案,右侧实时生成关于中心点对称的图案。支持设计复杂的对称图形,培养美学与几何直觉。 @Entry @Component struct SymmetryDesign {@State private paths: …...

Harmonyos应用实例164:旋转作图工具

应用实例四:旋转作图工具 知识点:第二十三章《旋转》—— 旋转的性质。 功能:学生绘制一个简单图形,设定旋转中心和旋转角度(如逆时针90度),应用动画演示旋转过程,并显示对应点到旋转中心的距离相等。 @Entry @Component struct RotationTool {@State private rotat…...

Code Llama实战指南:从安装到高效编程

1. Code Llama初探:你的AI编程助手 第一次听说Code Llama时,我正在为一个Python项目的代码补全功能头疼。当时我试过市面上好几个代码辅助工具,要么响应速度慢,要么生成的代码质量不稳定。直到在Hugging Face社区发现了这个基于Ll…...

Harmonyos应用实例163:抛物线篮球投篮模拟

应用实例三:抛物线篮球投篮模拟 知识点:第二十二章《二次函数》—— 实际问题与二次函数。 功能:模拟投篮轨迹。学生调整出球角度和力度(参数),抛物线随之改变。判断是否能投进篮筐,系统计算最高点和落点,将数学参数转化为物理直觉。 @Entry @Component struct Bask…...

IMU标定避坑指南:如何用imu_utils获取高精度噪声参数(附2小时数据采集技巧)

IMU标定避坑指南:如何用imu_utils获取高精度噪声参数(附2小时数据采集技巧) 在无人机和移动机器人导航系统中,惯性测量单元(IMU)的精度直接影响定位准确性。许多开发者在使用扩展卡尔曼滤波(EKF…...

告别C++:用Python pysoem库玩转EtherCAT,实现多轴电机协同运动控制Demo

Python与EtherCAT的工业控制革命:多轴协同运动控制实战 在工业自动化领域,EtherCAT(以太网控制自动化技术)凭借其高实时性和分布式时钟同步机制,已成为运动控制系统的首选总线协议。传统上,这类系统开发多采…...

基于永磁同步电机无位置高频注入算法SVPWM控制的模型仿真及其在实验中的应用

基于永磁同步电机无位置高频注入算法SVPWM控制,模型仿真可以应用到实验。 玩过电机控制的都知道,无传感器算法里高频注入是个有意思的骚操作。今天咱们来点硬核的——把高频信号直接怼进SVPWM里玩永磁同步电机的位置估算,这可比传统滑模观测…...

四维数据可视化总让人头疼,尤其是当属性值需要与三维坐标联动时。最近在搞电磁场仿真,被迫琢磨出一套实用技巧。直接上干货,先看这段自生成数据的代码

matlab绘图代码—四维数据可视化处理(XYZ坐标加属性值),可查看三维云图和任意方向的切片云图,更改渲染颜色,限定colorbar的显示范围,纯自己编写[X,Y,Z] meshgrid(-3:0.3:3); % 生成三维网格 T X.*exp(-X.^2-Y.^2-Z.…...

从农业到救灾:拆解6个垂直领域的无人机数据集,看AI如何落地

无人机数据集驱动的行业智能化:6大垂直领域实战解析 当无人机搭载的摄像头掠过一片农田,传回的不仅是高清图像,更是每株作物的健康密码;当热成像仪穿透浓烟捕捉火场动态,数据流中流淌的是救援人员的决策依据。这些场景…...

最新!2026年3月OpenClaw(Clawdbot)华为云2分钟超简单部署教程

最新!2026年3月OpenClaw(Clawdbot)华为云2分钟超简单部署教程。本文面向零基础用户,完整说明在轻量服务器与本地Windows11、macOS、Linux系统中部署OpenClaw(Clawdbot)的流程,包含环境配置、服务…...

华为手机各系列芯片解析与性能对比

1. 华为手机芯片发展简史与核心架构 华为海思麒麟芯片的进化史堪称国产半导体行业的缩影。从早期K3V2的发热争议到麒麟9000跻身第一梯队,我拆解过从Mate7到Mate40全系主板,最直观的感受是晶体管密度每代提升约40%。以7nm工艺的麒麟980为例,其…...

避坑指南:Kettle8.2删除组件配置最常见的5个错误及解决方法

Kettle8.2删除组件实战避坑手册:5个高频错误场景深度解析 在ETL工具Kettle(现称Pentaho Data Integration)的日常使用中,删除组件(Delete)作为数据清洗环节的核心操作模块,其配置准确性直接关系…...

Claude Task Master (MCP) : AI驱动开发中的智能任务拆解与编辑器协同实践

1. Claude Task Master的核心价值与应用场景 Claude Task Master(简称MCP)正在重塑AI驱动开发的范式。作为一个专为现代开发者设计的智能任务管理系统,它巧妙地将Claude的AI能力与开发流程深度融合。想象一下,当你面对一个复杂项目…...

Unity2022打包安卓APK,Gradle Daemon报错别慌!手把手教你修改settingsTemplate.gradle文件搞定

Unity2022安卓打包Gradle Daemon报错终极解决方案 当你满心期待地在Unity2022中点击"Build APK"按钮,却看到控制台弹出"Starting a Gradle Daemon, 1 incompatible Daemon could not be reused"的红色错误时,那种感觉就像在马拉松终…...

Secret安全管理技巧:Kubernetes中subPath的三种高阶用法(2024实测版)

Kubernetes安全实践:subPath在敏感数据管理中的三大高阶策略 引言 在云原生架构中,敏感数据的安全管理始终是企业面临的核心挑战。传统的数据挂载方式往往采用"全量暴露"模式,导致容器获得了远超其实际需要的访问权限,这…...

从烽火台到智能光网:OTN控制技术如何实现故障自愈?

从烽火信号到智能光网:OTN自愈技术如何重塑通信可靠性 1. 通信技术演进的千年跨越 公元前8世纪,周幽王为博褒姒一笑点燃的烽火台,或许是人类最早的光通信尝试。这种依靠肉眼可见光传递信息的方式,受限于天气条件与传输距离&#x…...

从零到一:使用CANdb++ Editor构建DBC文件的实战避坑指南

1. 认识DBC文件:汽车电子的"通信词典" 第一次接触DBC文件时,我把它想象成汽车电子系统的"通信词典"。这个特殊的数据库文件(Database for CAN)定义了CAN总线网络中所有参与者的"语言规则"——包括信…...

杨立昆等联合发文:为何AI还不能自学习?如何实现?

当前,人工智能(AI)在自主学习方面存在一个根本性缺陷:缺乏像人一样学习的能力。儿童从出生起就在学习和行动,他们能灵活选择关注什么、学习什么、何时行动、何时观察,并在不同学习模式间自由切换。相比之下…...

从Entropy到Epiplexity

1948年,香农以《通信的数学理论》为信息时代立碑,香农熵与柯尔莫哥洛夫复杂度自此成为信息世界的绝对法则。七十余年,学界笃信:信息守恒,确定性变换无法生新;顺序无关,信息总量与排列无涉&#…...

量子计算受到严重质疑,新研究提出量子系统存在规模上限

首先,发表在《美国国家科学院院刊》(PNAS)上的一项新研究表明,量子系统可能存在规模上限。该研究提出了一种名为“理性量子力学”的模型,该模型认为量子系统的数据量存在固定限制。论文的题目是《Rational quantum mec…...

在Java中什么是面向对象编程思想

Java面向对象编程的本质是用类建模事物、对象承载状态、包装、继承和多态组织逻辑;类是抽象模板,对象是具体的例子;包装注重可控访问,继承表达“一”,组合表达“一”,界面定义能力合同,抽象类提…...

Java中的并发工具类与ConcurrentHashMap

ConcurrentHashMap 不能用 put 替代 computeIfAbsent,因 put 初始化的原子性不能保证,但原子性不能保证 computeIfAbsent 通过 RESERVED 状态、CAS 并保证分段锁 key 对应 value 只创建一次。ConcurrentHashMap 为什么不能直接使用? put 替代…...

Shiro无回显漏洞实战:JRMP协议探测与内存马注入技巧

1. Shiro无回显漏洞的困境与突破 很多安全工程师都遇到过这样的尴尬场景:明明通过工具扫描发现了Shiro框架的加密密钥(key),但在实际利用时却发现目标系统没有任何回显。这种情况就像拿到了保险箱密码却发现箱子里空空如也&#x…...

国产化替代实战:银河麒麟V10+ARM平台如何绕过Docker 18限制跑KubeSphere 3.3

国产化ARM平台容器化突围:银河麒麟V10部署KubeSphere 3.3全实战指南 当国产化替代遇上云原生技术栈,技术团队往往需要在不完善的生态中寻找突破口。银河麒麟V10作为国产操作系统的代表,其ARM架构版本在部署最新版KubeSphere时面临的核心矛盾在…...

企业级NAS如何为vSphere提供高性能共享存储?ISCSI优化配置与容量监控技巧

企业级NAS与vSphere深度整合:ISCSI性能调优与智能监控实战 在虚拟化架构中,存储性能往往成为制约整体系统效率的关键瓶颈。根据实际运维数据显示,超过60%的vSphere性能问题可追溯至存储子系统配置不当。本文将深入剖析如何通过ISCSI协议实现企…...

哈工大集合论与图论慕课答案全解析(2022最新版)——附对比选项技巧

哈工大集合论与图论慕课高效学习指南:解题策略与知识点精要 引言:如何高效攻克集合论与图论慕课 集合论与图论作为计算机科学和数学的重要基础课程,在哈工大慕课平台上吸引了大量学习者。然而,许多同学在学习过程中常常陷入"…...