二叉树重建与层序遍历算法详解
1. 题目背景与核心需求L2-011是数据结构与算法中一道经典的二叉树操作题目主要考察对二叉树结构的理解和基本操作能力。题目要求我们根据给定的前序遍历和中序遍历序列构建出原始二叉树然后输出该二叉树的层序遍历序列即广度优先遍历结果。这道题在编程竞赛和算法面试中具有典型性因为它同时考察了以下几个核心能力二叉树前序/中序序列的还原算法层序遍历的非递归实现C标准库中队列容器的使用指针或智能指针管理二叉树节点2. 二叉树重建原理分析2.1 前序与中序遍历特性前序遍历的特点是根节点 → 左子树 → 右子树 中序遍历的特点是左子树 → 根节点 → 右子树通过这两个特性的组合我们可以从前序遍历序列中确定当前子树的根节点在中序遍历序列中找到该根节点的位置根据中序遍历结果划分左右子树的范围递归处理左右子树2.2 重建算法实现步骤具体实现时需要注意以下关键点使用哈希表存储中序遍历的值到索引的映射加速查找递归函数需要维护当前子树在前序和中序序列中的范围处理边界条件空子树情况注意数组索引的偏移计算unordered_mapint, int in_map; // 中序遍历值到索引的映射 TreeNode* buildTree(vectorint preorder, int pre_start, int pre_end, vectorint inorder, int in_start, int in_end) { if (pre_start pre_end) return nullptr; int root_val preorder[pre_start]; TreeNode* root new TreeNode(root_val); int in_root in_map[root_val]; int left_size in_root - in_start; root-left buildTree(preorder, pre_start 1, pre_start left_size, inorder, in_start, in_root - 1); root-right buildTree(preorder, pre_start left_size 1, pre_end, inorder, in_root 1, in_end); return root; }3. 层序遍历实现详解3.1 标准层序遍历算法层序遍历需要使用队列作为辅助数据结构算法步骤如下将根节点入队当队列不为空时 a. 取出队首节点并访问 b. 将该节点的左右子节点如果存在依次入队重复步骤2直到队列为空3.2 C实现要点在C中实现时需要注意使用queueTreeNode*来管理待访问节点需要处理空树的情况输出格式要求本题通常要求空格分隔vectorint levelOrder(TreeNode* root) { vectorint result; if (!root) return result; queueTreeNode* q; q.push(root); while (!q.empty()) { TreeNode* node q.front(); q.pop(); result.push_back(node-val); if (node-left) q.push(node-left); if (node-right) q.push(node-right); } return result; }4. 完整题解代码实现4.1 数据结构定义首先定义二叉树节点结构struct TreeNode { int val; TreeNode *left; TreeNode *right; TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} };4.2 主解题函数将重建和遍历过程整合TreeNode* buildTree(vectorint preorder, vectorint inorder) { for (int i 0; i inorder.size(); i) { in_map[inorder[i]] i; } return buildTree(preorder, 0, preorder.size() - 1, inorder, 0, inorder.size() - 1); } vectorint levelOrderTraversal(TreeNode* root) { // 同上levelOrder实现 }4.3 主函数流程int main() { int n; cin n; vectorint preorder(n), inorder(n); for (int i 0; i n; i) cin preorder[i]; for (int i 0; i n; i) cin inorder[i]; TreeNode* root buildTree(preorder, inorder); vectorint result levelOrderTraversal(root); for (int i 0; i result.size(); i) { if (i ! 0) cout ; cout result[i]; } return 0; }5. 常见问题与调试技巧5.1 重建错误排查当二叉树重建不正确时检查中序遍历映射表是否正确建立验证递归时的索引范围计算打印中间结果调试子树范围5.2 内存管理建议在竞赛环境中可以忽略内存释放但在实际工程中使用unique_ptr等智能指针管理节点或者实现析构函数递归删除节点5.3 输入输出处理注意题目对输入输出的特殊要求多个测试用例的情况输出末尾不能有多余空格大数据量的性能考虑6. 算法优化与变种6.1 迭代法重建二叉树可以使用栈来避免递归减少函数调用开销TreeNode* buildTreeIterative(vectorint preorder, vectorint inorder) { if (preorder.empty()) return nullptr; stackTreeNode* stk; TreeNode* root new TreeNode(preorder[0]); stk.push(root); int in_idx 0; for (int i 1; i preorder.size(); i) { TreeNode* node stk.top(); if (node-val ! inorder[in_idx]) { node-left new TreeNode(preorder[i]); stk.push(node-left); } else { while (!stk.empty() stk.top()-val inorder[in_idx]) { node stk.top(); stk.pop(); in_idx; } node-right new TreeNode(preorder[i]); stk.push(node-right); } } return root; }6.2 其他遍历组合问题类似思路可以解决后序中序重建二叉树前序后序重建二叉树结果不唯一层序中序重建二叉树7. 实际应用场景二叉树遍历在以下场景有重要应用文件系统目录结构的遍历DOM树的解析与渲染游戏场景树的更新编译器语法分析树的处理理解这些基础算法有助于解决更复杂的树形结构问题。在实际工程中我们经常会遇到需要自定义树遍历顺序或方式的场景掌握这些基本原理可以灵活应对各种变化需求。

相关新闻

kernelpwn初学者必读:从下载源码到调试漏洞的完整步骤

kernelpwn初学者必读:从下载源码到调试漏洞的完整步骤

kernelpwn初学者必读:从下载源码到调试漏洞的完整步骤 【免费下载链接】kernelpwn kernel-pwn and writeup collection 项目地址: https://gitcode.com/gh_mirrors/ke/kernelpwn kernelpwn是CTF比赛中的高级挑战类型,涉及内核漏洞利用与系统底层安…

2026/10/15 13:53:49 阅读更多 →
区域科技创新发展路径与政府管理策略

区域科技创新发展路径与政府管理策略

1. 区域科技创新的现状与挑战科技创新已成为推动区域经济发展的核心引擎。根据最新统计数据显示,我国研发经费投入强度已突破2.5%,但区域间创新资源配置不均衡的问题依然突出。作为区域科技创新的主要推动者,政府科技管理部门面临着多重挑战&…

2026/10/15 13:53:49 阅读更多 →
区域科技创新管理的核心挑战与生态构建策略

区域科技创新管理的核心挑战与生态构建策略

1. 区域科技创新管理的核心挑战科技创新管理从来就不是简单的资源堆砌。在长三角某科技园区调研时,我注意到一个有趣现象:同样规模的财政投入,A区孵化出3家独角兽企业,而相邻的B区却连像样的技术转化案例都寥寥无几。这背后反映的…

2026/10/8 14:09:57 阅读更多 →

最新新闻

OpenSim CMC计算肌肉控制:从原理到实战的完整指南

OpenSim CMC计算肌肉控制:从原理到实战的完整指南

1. 从静态仿真到动态模拟:CMC到底在算什么很多人第一次接触Opensim的CMC工具时,都会有一个疑问:我已经用IK(逆向运动学)把实验数据映射到模型上了,为什么还要再跑一遍CMC?这个问题我当初也纠结了…

2026/10/15 13:53:36 阅读更多 →
线性代数知识点总结:行列式、矩阵与方程组解题核心

线性代数知识点总结:行列式、矩阵与方程组解题核心

简介:这是一份面向线性代数学习者的知识点总结文档,内容聚焦行列式与矩阵两大核心模块,适合期末复习、考研备考或日常查漏补缺。文档采用docx格式,压缩包内仅1个文件,大小572KB,便于直接打开阅读或打印。资…

2026/10/15 13:53:36 阅读更多 →
Spring Boot + MySQL 网上购物商城系统:课程设计到高并发实战

Spring Boot + MySQL 网上购物商城系统:课程设计到高并发实战

简介:这份资源是面向计算机及相关专业本科生、研究生的MySQL网上购物系统课程设计文档,基于Spring Boot框架、Java技术与MySQL数据库,采用B/S结构实现完整的在线购物平台。内容覆盖需求分析、系统设计、编码实现与系统测试全过程,…

2026/10/15 13:53:36 阅读更多 →
Python办公文档自动化:Word、Excel、PPT创建与解析实战指南

Python办公文档自动化:Word、Excel、PPT创建与解析实战指南

1. 为什么办公文档自动化是绕不开的一环但凡在职场里待过几年,你大概率都经历过这样的场景:月底了,要从系统里导出几百条数据,一条条复制粘贴到Word模板里生成合同或者报告;或者收到一堆格式各异的Excel表格&#xff0…

2026/10/15 13:53:36 阅读更多 →
Java Web火车票订票系统源码解析:从环境搭建到二次开发

Java Web火车票订票系统源码解析:从环境搭建到二次开发

简介:这是一套面向计算机相关专业毕业设计场景的火车票订票系统完整资料包,适合正在准备毕设、课程设计或期末大作业的Java学习者使用。项目基于Java语言开发,后端采用SSM框架,前端使用JSP,数据库为MySQL,服…

2026/10/15 13:53:36 阅读更多 →
粒子群算法解柔性作业车间调度:双链编码实战与Kacem基准验证

粒子群算法解柔性作业车间调度:双链编码实战与Kacem基准验证

简介:一套基于Java的粒子群算法(PSO)实现,用于求解柔性作业车间调度(FJSP)问题,适合正在学习智能优化算法、开展生产调度相关课题或课程设计的学生与科研人员。压缩包共26个文件,主要…

2026/10/15 13:52:34 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/15 13:48:15 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 9:49:14 阅读更多 →