从中序与后序,前序与中序遍历序列构造二叉树
根据后序数组的最后一位把中序分成左右两个。那么代码应该怎么写呢说到一层一层切割就应该想到了递归。第一步如果数组大小为零的话说明是空节点了。第二步如果不为空那么取后序数组最后一个元素作为节点元素。第三步找到后序数组最后一个元素在中序数组的位置作为切割点第四步切割中序数组切成中序左数组和中序右数组 顺序别搞反了一定是先切中序数组第五步切割后序数组切成后序左数组和后序右数组第六步递归处理左区间和右区间TreeNode* traversal (vectorint inorder, vectorint postorder) { // 第一步 if (postorder.size() 0) return NULL; // 第二步后序遍历数组最后一个元素就是当前的中间节点 int rootValue postorder[postorder.size() - 1]; TreeNode* root new TreeNode(rootValue); // 叶子节点 if (postorder.size() 1) return root; // 第三步找切割点 int delimiterIndex; for (delimiterIndex 0; delimiterIndex inorder.size(); delimiterIndex) { if (inorder[delimiterIndex] rootValue) break; } // 第四步切割中序数组得到 中序左数组和中序右数组 // 第五步切割后序数组得到 后序左数组和后序右数组 // 第六步 root-left traversal(中序左数组, 后序左数组); root-right traversal(中序右数组, 后序右数组); return root; }这是完整代码我把要注意的地方都标注进去了/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(nullptr), right(nullptr) {} * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {} * }; */ class Solution { public: TreeNode* traversal(vectorint inorder, vectorint postorder){ if(postorder.size()0)return NULL; int rootvaluepostorder[postorder.size()-1]; TreeNode*rootnew TreeNode(rootvalue); if(postorder.size()1)return root; //不要忘记这一步接下来先找切割点 int delimiterIndex; for(delimiterIndex0;delimiterIndexinorder.size();delimiterIndex){ if(inorder[delimiterIndex]rootvalue)break; } //接下来分割中序,得到中序左中序右 vectorintinorderleft(inorder.begin(),inorder.begin()delimiterIndex);//代码中我坚持左闭右开的原则 vectorintinorderright(inorder.begin()delimiterIndex1,inorder.end());//不要忘了加1跳过root。C 里的 end() 是“最后一个元素的下一个位置”所以左闭右开最后一个也存上了 //分割后续得到后续左后续右 postorder.pop_back(); vectorintpostorderleft(postorder.begin(),postorder.begin()delimiterIndex); vectorintpostorderright(postorder.begin()delimiterIndex,postorder.end()); root-lefttraversal(inorderleft,postorderleft); root-righttraversal(inorderright,postorderright); return root; } TreeNode* buildTree(vectorint inorder, vectorint postorder) { return traversal(inorder,postorder); } };为什么vectorintinorderleft(inorder.begin(),inorder.begin()delimiterIndex);是左闭右开的这行代码是怎么执行“左闭右开”的当你写下vectorint inorderleft(inorder.begin(), inorder.begin() delimiterIndex);编译器会这样操作起点左闭从inorder.begin()指向的位置开始即数组的第一个元素索引 0包含它。终点右开向后移动一直移动到inorder.begin() delimiterIndex指向的位置即索引delimiterIndex。停止条件一旦到达终点位置立即停下来不拷贝终点位置指向的那个元素。在后序数组里delimiterIndex是“左子树的个数”后序的结构是[左子树全部] [右子树全部] [根节点]。我们先把根节点pop_back()扔掉了剩下[左子树全部] [右子树全部]。现在问题来了左子树有几个节点答案就是delimiterIndex个因为中序里左子树有delimiterIndex个整棵树节点总数是守恒的。此时写postorder.begin() delimiterIndex起点是begin终点是begin 左子树个数。这个区间取了[0, 左子树个数)也就是刚刚好取了全部左子树节点。这里并没有“根节点”需要跳过因为根节点已经被我们提前扔掉了。所以不需要加 1。中序[9, 3, 15, 20, 7]后序[9, 15, 7, 20, 3]根 3delimiterIndex 1左子树有 1 个节点9看后序切割去掉根postorder变为[9, 15, 7, 20]长度 4。左后序取前 1 个postorder.begin() 1指向数字15。区间[begin, begin1)只取了索引 0数字9。结果[9]✅ 一个不多一个不少右后序取剩下的begin 1到end取了[15, 7, 20]✅ 正确接下来用一个前中数组检测一下自己学会了没有/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(nullptr), right(nullptr) {} * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {} * }; */ class Solution { public: TreeNode* build(vectorint preorder, vectorint inorder) { if(preorder.size()0)return NULL; int rootvaluepreorder[0];//这里不要写成1了 TreeNode*rootnew TreeNode(rootvalue); //返回根节点。 if(preorder.size()1)return root; //找断点 int delimiterIndex; for(delimiterIndex0;delimiterIndexinorder.size();delimiterIndex){ if(inorder[delimiterIndex]rootvalue)break; } //左闭右开分中序遍历 vectorintleftin(inorder.begin(),inorder.begin()delimiterIndex); vectorintrightin(inorder.begin()delimiterIndex1,inorder.end()); //分前序遍历前先去掉第一位。 preorder.erase(preorder.begin()); //开始分割 vectorintleftpre(preorder.begin(),preorder.begin()delimiterIndex); vectorintrightpre(preorder.begin()delimiterIndex,preorder.end()); //开始递归 root-leftbuild(leftpre,leftin); root-rightbuild(rightpre,rightin); return root; } TreeNode* buildTree(vectorint preorder, vectorint inorder) { return build(preorder,inorder); } };

相关新闻

贝叶斯网络实战:构建可解释的医疗诊断推理引擎

贝叶斯网络实战:构建可解释的医疗诊断推理引擎

1. 这不是数学课,而是一场关于“不确定世界如何做决定”的实战复盘你有没有过这种时刻:医生看着你的检查报告,说“有70%可能是甲亢”,但没告诉你这个70%是怎么算出来的;自动驾驶系统在暴雨中突然降速,提示“…

2026/7/21 22:06:17阅读更多 →
PKUAutoElective常见问题解答:从安装到运行的全方位解决方案

PKUAutoElective常见问题解答:从安装到运行的全方位解决方案

PKUAutoElective常见问题解答:从安装到运行的全方位解决方案 【免费下载链接】PKUAutoElective 北大选课网补退选阶段自动选课小工具 项目地址: https://gitcode.com/gh_mirrors/pk/PKUAutoElective PKUAutoElective是一款专为北京大学学生设计的补退选阶段自…

2026/7/21 20:36:01阅读更多 →
DIAMOND技术报告解读:深入理解语音修复模型的创新与突破

DIAMOND技术报告解读:深入理解语音修复模型的创新与突破

DIAMOND技术报告解读:深入理解语音修复模型的创新与突破 【免费下载链接】diamond-1.0 项目地址: https://ai.gitcode.com/hf_mirrors/nineninesix/diamond-1.0 DIAMOND是一款革命性的语音修复模型,它通过自回归RQ-Transformer处理神经音频编解码…

2026/7/21 23:02:59阅读更多 →
未来AI开发趋势:GitHub_Trending/cla/claude-skills路线图与新功能预告

未来AI开发趋势:GitHub_Trending/cla/claude-skills路线图与新功能预告

未来AI开发趋势:GitHub_Trending/cla/claude-skills路线图与新功能预告 【免费下载链接】claude-skills 345 Claude Code skills & agent skills & plugins (30 Agents, 70 custom commands, 330 skills, customizable references, scripts)for Claude Code…

2026/7/22 18:43:20阅读更多 →
揭秘DBdeployer架构:核心组件与模板系统详解

揭秘DBdeployer架构:核心组件与模板系统详解

揭秘DBdeployer架构:核心组件与模板系统详解 【免费下载链接】dbdeployer DBdeployer is a tool that deploys MySQL database servers easily. 项目地址: https://gitcode.com/gh_mirrors/db/dbdeployer DBdeployer 是一款功能强大的 MySQL 数据库部署工具&…

2026/7/22 18:43:20阅读更多 →
嵌入式低功耗设计:深入解析PSC寄存器与电源管理实战

嵌入式低功耗设计:深入解析PSC寄存器与电源管理实战

1. 项目概述与核心价值 在嵌入式系统开发,尤其是电池供电或对功耗敏感的应用中,电源管理从来都不是一个“锦上添花”的可选项,而是决定产品成败的关键技术。我经历过不止一个项目,前期功能跑得飞起,一到功耗测试就“翻…

2026/7/22 18:43:20阅读更多 →
Umbilical Rear Passthrough:whopping_Voron_mods终极3D打印机线缆管理解决方案

Umbilical Rear Passthrough:whopping_Voron_mods终极3D打印机线缆管理解决方案

Umbilical Rear Passthrough:whopping_Voron_mods终极3D打印机线缆管理解决方案 【免费下载链接】whopping_Voron_mods 项目地址: https://gitcode.com/gh_mirrors/wh/whopping_Voron_mods whopping_Voron_mods项目的Umbilical Rear Passthrough是一款专为3…

2026/7/22 18:43:20阅读更多 →
GECCO 2025,基于自动景观特征的强化学习自适应差分进化算法

GECCO 2025,基于自动景观特征的强化学习自适应差分进化算法

目录1.摘要2.研究背景与 MetaBBO3.RLDE-AFL 双层框架4.自动景观特征学习5.强化学习驱动的 DE 动态配置6.实验结果7.参考文献8.算法辅导应用定制读者交流1.摘要 元黑箱优化(Meta-Black-Box Optimization,MetaBBO)通过学习可迁移的元策略&…

2026/7/22 18:43:20阅读更多 →
国内主流 LoRa 模块厂商与硬件选型对比指南

国内主流 LoRa 模块厂商与硬件选型对比指南

在工业物联网与智慧城市的项目落地中,基于 LPWAN(低功耗广域网)的无线通信方案始终占据重要地位。LoRa 凭借非授权频段、部署灵活、低功耗以及极强的抗干扰能力,成为了绝大多数远距离数据采集项目的首选方案。 据全球物联网连接数…

2026/7/22 18:41:20阅读更多 →
Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/22 0:53:59阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/22 0:53:59阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/22 0:53:59阅读更多 →
中小企业小程序开发公司怎么选:预算、上手和售后避坑指南

中小企业小程序开发公司怎么选:预算、上手和售后避坑指南

中小企业做小程序,最常见的矛盾是预算有限,但又不希望功能太单薄;没有技术团队,但又希望后续能自己运营;想快速上线,又担心隐性收费和售后失联。选型时如果只看“低价套餐”或“案例数量”,很容…

2026/7/22 0:01:17阅读更多 →
GEO优化如何沉淀长期内容资产?广拓时代谈AI搜索时代的内容ROI

GEO优化如何沉淀长期内容资产?广拓时代谈AI搜索时代的内容ROI

企业做营销,最怕钱花完了,资产没有留下。 效果广告能带来一段时间的曝光,但预算停止后,流量往往也随之停止。短视频内容可能在几天内冲高,也可能很快沉下去。AI搜索时代,企业需要重新思考一个问题&#xff…

2026/7/22 0:01:17阅读更多 →
Agent 终态判定:何时该停止思考、给出最终回复

Agent 终态判定:何时该停止思考、给出最终回复

Agent 终态判定:何时该停止思考、给出最终回复 一、你的 Agent 在"再想想"的循环里绕了 12 轮,用户已经关窗口了 Agent 与人最大的区别是:人知道什么时候该停下来给答案,Agent 会一直"想"下去。你给 Agent 接…

2026/7/22 0:01:17阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/21 22:53:50阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/21 18:53:30阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/21 18:53:30阅读更多 →