P1030 [NOIP 2001 普及组] 求先序排列
记录144#includebits/stdc.h using namespace std; // 使用标准命名空间std string in_str,post_str; // 全局变量存储中序和后序遍历字符串 // 递归函数根据中序和后序的区间输出前序遍历 // l1,r1: 中序遍历字符串的左右边界 [l1,r1] // l2,r2: 后序遍历字符串的左右边界 [l2,r2] void dfs(int l1,int r1,int l2,int r2) { // 递归终止条件如果区间无效左边界大于右边界说明子树为空直接返回 if(l1r1) return; // 1. 找根节点后序遍历的最后一个字符就是根 char rootpost_str[r2]; // 2. 在中序遍历中找到根节点的位置 p int pl1; while(in_str[p]!root) { p; } // 计算左子树的节点个数 int left_sizep-l1; // 3. 输出根节点前序遍历根左右根放在最前面输出 coutroot; // 4. 递归处理左子树 // 中序左子树范围[l1,p-1] // 后序左子树范围[l2,l2left_size-1] dfs(l1,p-1,l2,l2left_size-1); // 5. 递归处理右子树 // 中序右子树范围[p1,r1] // 后序右子树范围[l2left_size,r2-1] (注意r2是根要减1) dfs(p1,r1,l2left_size,r2-1); } int main() { // 主函数入口 ios::sync_with_stdio(false); // 关闭同步加速IO cin.tie(0); // 读入中序遍历和后序遍历 cinin_strpost_str; // 启动递归初始区间都是整个字符串的长度 dfs(0,in_str.size()-1,0,post_str.size()-1); cout\n; // 输出换行 return 0; }题目传送门https://www.luogu.com.cn/problem/P1030前言我是一名专注信奥赛CSP-J/S、NOIP的教练。如果你觉得这篇题解对你有帮助欢迎点击关注我的CSDN账号我会持续更新高质量算法解析。我深知算法思维的构建远比单纯通过题目更重要本系列题解不局限于AC代码的堆砌而是致力于拆解题目背后的逻辑链条与核心知识点备赛路上若遇瓶颈欢迎随时评论或私信我将甄选典型疑难问题通过视频讲解或撰写专项文章的形式为你提供深度答疑。核心解题思路这道题是一道非常经典的二叉树遍历与递归重建问题其核心原理与“中序前序求后序”类似但细节上存在关键差异。核心原理在二叉树的三种遍历方式中后序遍历左-右-根的最后一个元素永远是当前子树的根节点而中序遍历左-根-右中根节点会将序列完美地分割为左子树和右子树两部分。利用这两个特性我们可以通过递归的方式不断地从字符串中“切”出左子树和右子树从而在逻辑上重建这棵二叉树。算法设计分治递归题目要求输出先序遍历根-左-右。我们不需要真正地在内存中构建出树的结构只需要在递归的过程中按照“先输出根节点 - 再递归处理左子树 - 最后递归处理右子树”的顺序进行操作即可直接得到先序遍历的结果。代码分块详细解释1. 头文件与全局变量定义#includebits/stdc.h using namespace std; // 使用标准命名空间std string in_str, post_str; // 全局变量存储中序和后序遍历字符串详细分析由于树的节点用唯一的大写字母表示且节点个数不超过 8 个使用string类型来存储遍历序列非常方便。将这两个字符串定义为全局变量可以避免在递归函数中反复传递庞大的字符串副本提高程序运行效率。2. 核心逻辑分治递归函数dfs// 递归函数根据中序和后序的区间输出前序遍历 // l1,r1: 中序遍历字符串的左右边界 [l1,r1] // l2,r2: 后序遍历字符串的左右边界 [l2,r2] void dfs(int l1, int r1, int l2, int r2) { // 递归终止条件如果区间无效左边界大于右边界说明子树为空直接返回 if(l1 r1) return; // 1. 找根节点后序遍历的最后一个字符就是根 char root post_str[r2]; // 2. 在中序遍历中找到根节点的位置 p int p l1; while(in_str[p] ! root) { p; } // 计算左子树的节点个数 int left_size p - l1; // 3. 输出根节点前序遍历根左右根放在最前面输出 cout root; // 4. 递归处理左子树 // 中序左子树范围[l1, p-1] // 后序左子树范围[l2, l2left_size-1] dfs(l1, p-1, l2, l2left_size-1); // 5. 递归处理右子树 // 中序右子树范围[p1, r1] // 后序右子树范围[l2left_size, r2-1] (注意r2是根要减1) dfs(p1, r1, l2left_size, r2-1); }详细分析这是本题的灵魂所在完美体现了“分治”思想。确定根节点与“前序找根”不同后序遍历的特点是“根节点在最后面”所以当前后序区间的最后一个字符post_str[r2]必定是当前子树的根。划分左右子树在中序遍历区间[l1, r1]中找到这个根节点的位置p。根据中序遍历“左-根-右”的规则[l1, p-1]这一段全是左子树的节点[p1, r1]这一段全是右子树的节点。计算子树大小左子树的节点个数left_size p - l1。这个数值至关重要因为它帮助我们在后序遍历中准确切分出左右子树的区间。后序遍历中左子树节点在前右子树节点在后最后是根。所以左子树在后序中的区间是[l2, l2left_size-1]右子树是[l2left_size, r2-1]注意右边界r2是根节点必须减 1。先序输出函数先cout root输出根节点然后递归处理左子树最后递归处理右子树。这种“根左右”的输出顺序恰好就是先序遍历的定义。3. 主函数输入处理与启动递归int main() { ios::sync_with_stdio(false); // 关闭同步加速IO cin.tie(0); // 读入中序遍历和后序遍历 cin in_str post_str; // 启动递归初始区间都是整个字符串的长度 dfs(0, in_str.size()-1, 0, post_str.size()-1); cout \n; // 输出换行 return 0; }详细分析主函数非常简洁主要负责读取输入并启动递归。dfs(0, in_str.size()-1, 0, post_str.size()-1)表示最初我们要处理的是完整的中序和后序字符串左右边界分别是0和字符串长度-1。核心逻辑总结表代码模块核心变量/操作精炼作用解决的痛点根节点定位char root post_str[r2]利用后序遍历特性提取当前子树的根确立了递归分治的基准点是划分左右子树的前提区间划分while(in_str[p]!root)在中序遍历中定位根节点的位置 p利用中序遍历特性将序列完美切割为左子树和右子树子树大小计算int left_size p - l1计算左子树包含的节点数量桥接中序与后序帮助在后序字符串中准确切分出左右子树的区间根节点输出cout root在递归左右子树之前输出根遵循先序遍历“最先根”的规则直接拼接出最终答案递归左子树dfs(l1, p-1, l2, ...)递归处理左半部分区间深入树的左侧分支遵循先序遍历“后左”的规则递归右子树dfs(p1, r1, ...left_size, r2-1)

相关新闻

Gemma-4-26B-A4B-it-qat-OptiQ-4bit架构剖析:从注意力机制到专家路由

Gemma-4-26B-A4B-it-qat-OptiQ-4bit架构剖析:从注意力机制到专家路由

Gemma-4-26B-A4B-it-qat-OptiQ-4bit架构剖析:从注意力机制到专家路由 【免费下载链接】gemma-4-26B-A4B-it-qat-OptiQ-4bit 项目地址: https://ai.gitcode.com/hf_mirrors/mlx-community/gemma-4-26B-A4B-it-qat-OptiQ-4bit Gemma-4-26B-A4B-it-qat-OptiQ-4…

2026/7/11 15:50:08阅读更多 →
终极指南:如何让2007-2017年的老旧Mac重获新生,免费升级最新macOS

终极指南:如何让2007-2017年的老旧Mac重获新生,免费升级最新macOS

终极指南:如何让2007-2017年的老旧Mac重获新生,免费升级最新macOS 【免费下载链接】OpenCore-Legacy-Patcher Experience macOS just like before 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher 还在为你的老Mac被苹…

2026/7/11 15:50:08阅读更多 →
MagpieTTS Multilingual 357M API完全指南:无需GPU的云端语音合成方案

MagpieTTS Multilingual 357M API完全指南:无需GPU的云端语音合成方案

MagpieTTS Multilingual 357M API完全指南:无需GPU的云端语音合成方案 【免费下载链接】magpie_tts_multilingual_357m 项目地址: https://ai.gitcode.com/hf_mirrors/nvidia/magpie_tts_multilingual_357m MagpieTTS Multilingual 357M是一款强大的文本转语…

2026/7/11 15:45:08阅读更多 →
L9958与TM4C129XKCZAD的电机驱动系统设计与优化

L9958与TM4C129XKCZAD的电机驱动系统设计与优化

1. 项目背景与硬件选型解析 在工业自动化和机器人控制领域,直流电机驱动系统的性能直接决定了整个设备的响应速度和控制精度。L9958作为STMicroelectronics推出的汽车级H桥驱动器,搭配TI的TM4C129XKCZAD微控制器,这套组合在电机控制领域堪称&…

2026/7/11 16:40:13阅读更多 →
demo-ai-app的AI功能详解:语义搜索、分类与推荐系统

demo-ai-app的AI功能详解:语义搜索、分类与推荐系统

demo-ai-app的AI功能详解:语义搜索、分类与推荐系统 【免费下载链接】demo-ai-app Sample AI movies app built with ❍ Ion 项目地址: https://gitcode.com/gh_mirrors/de/demo-ai-app demo-ai-app是一款基于Ion构建的AI电影应用,它通过强大的语…

2026/7/11 16:40:13阅读更多 →
融资融券的“信用密码”:解码担保品的杠杆魔法与生存法则

融资融券的“信用密码”:解码担保品的杠杆魔法与生存法则

在股市的杠杆交易战场上,融资融券为投资者打开了“以小博大”的大门,但并非所有人都能肆意驰骋。真正掌控这场游戏的关键,藏在看似枯燥的“担保品”规则中。它既是撬动资金的“魔法钥匙”,也是维系账户生存的“隐形护盾”。理解这…

2026/7/11 16:40:13阅读更多 →
如何将QRCode集成到你的iOS项目:Carthage、Cocoapods和手动安装指南

如何将QRCode集成到你的iOS项目:Carthage、Cocoapods和手动安装指南

如何将QRCode集成到你的iOS项目:Carthage、Cocoapods和手动安装指南 【免费下载链接】QRCode A QRCode generator written in Swift. 项目地址: https://gitcode.com/gh_mirrors/qr/QRCode 想要在你的iOS应用中快速生成二维码吗?QRCode是一个用Sw…

2026/7/11 16:40:13阅读更多 →
PUBG罗技鼠标宏:从弹道控制到竞技进阶的全方位指南

PUBG罗技鼠标宏:从弹道控制到竞技进阶的全方位指南

PUBG罗技鼠标宏:从弹道控制到竞技进阶的全方位指南 【免费下载链接】logitech-pubg PUBG no recoil script for Logitech gaming mouse / 绝地求生 罗技 鼠标宏 项目地址: https://gitcode.com/gh_mirrors/lo/logitech-pubg 还在为PUBG中难以驾驭的武器后坐力…

2026/7/11 16:40:13阅读更多 →
3步永久保存B站缓存视频:m4s-converter完整解决方案

3步永久保存B站缓存视频:m4s-converter完整解决方案

3步永久保存B站缓存视频:m4s-converter完整解决方案 【免费下载链接】m4s-converter 一个跨平台小工具,将bilibili缓存的m4s格式音视频文件合并成mp4 项目地址: https://gitcode.com/gh_mirrors/m4/m4s-converter 你是否曾经精心收藏的B站视频突然…

2026/7/11 16:35:13阅读更多 →
从GitHub安全案例解析常见漏洞与防护实践

从GitHub安全案例解析常见漏洞与防护实践

1. 项目概述:从GitHub Trending看安全实战 最近在GitHub Trending上看到一个项目,叫 skills4/skills ,它因为一些安全漏洞案例被大家讨论。这其实是一个挺典型的场景:一个旨在展示或教授某种技能的仓库,本身却成了安…

2026/7/10 12:10:00阅读更多 →
MLT 2026启示:因果推理与概率建模驱动下一代LLM应用

MLT 2026启示:因果推理与概率建模驱动下一代LLM应用

# MLT 2026启示:因果推理与概率建模驱动下一代LLM应用## 一、背景与挑战:从“黑箱预测”到“可信推理”2026年6月,第7届机器学习与趋势国际会议(MLT 2026)将在悉尼召开。会议议程中,“因果与可解释机器学习…

2026/7/11 15:18:12阅读更多 →
通达OA SQL注入漏洞深度剖析:从手工注入到自动化利用与防御

通达OA SQL注入漏洞深度剖析:从手工注入到自动化利用与防御

1. 项目概述与漏洞背景最近在梳理一些历史OA系统的安全风险时,通达OA v11.6版本中的一个老漏洞又进入了我的视线。这个漏洞位于/general/bi_design/appcenter/report_bi.func.php文件中,是一个典型的SQL注入点。虽然这个漏洞的利用方式看起来并不复杂&am…

2026/7/11 15:11:32阅读更多 →
Premiere Pro 2025安装失败原因与AGSIS验证绕过指南

Premiere Pro 2025安装失败原因与AGSIS验证绕过指南

1. 为什么2025版PR安装比以往更“磨人”?——从弹窗警告到路径陷阱的真实处境 Premiere Pro 2025版不是简单的一次版本迭代,它是一道分水岭。我从去年底开始帮影视工作室、高校剪辑实验室和自由职业者部署2025环境,累计处理了137台设备&#…

2026/7/11 0:03:43阅读更多 →
5款实用macOS系统优化工具:让你的Mac运行更流畅更高效

5款实用macOS系统优化工具:让你的Mac运行更流畅更高效

5款实用macOS系统优化工具:让你的Mac运行更流畅更高效 【免费下载链接】open-source-mac-os-apps 🚀 Awesome list of open source applications for macOS. https://t.me/s/opensourcemacosapps 项目地址: https://gitcode.com/gh_mirrors/op/open-so…

2026/7/11 0:03:43阅读更多 →
5分钟完全掌握:ComfyUI ControlNet预处理器终极使用指南

5分钟完全掌握:ComfyUI ControlNet预处理器终极使用指南

5分钟完全掌握:ComfyUI ControlNet预处理器终极使用指南 【免费下载链接】comfyui_controlnet_aux ComfyUIs ControlNet Auxiliary Preprocessors 项目地址: https://gitcode.com/gh_mirrors/co/comfyui_controlnet_aux 想要让AI图像生成真正听从你的指挥吗&…

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

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

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

2026/7/11 16:20:28阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

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

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

2026/7/10 22:20:33阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

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

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

2026/7/10 17:29:22阅读更多 →