二叉树前中后序遍历

发布时间:2026/9/24 23:18:52

二叉树前中后序遍历 二叉树前中后序遍历 - 代码实现思路与图解1. 项目概述本项目实现了二叉树的三种遍历方式前序遍历、中序遍历和后序遍历均采用递归实现。2. 数据结构定义2.1 二叉树节点结构typedefcharBTDataType;typedefstructBinaryTreeNode{structBinaryTreeNode*left;// 指向左孩子的指针structBinaryTreeNode*right;// 指向右孩子的指针BTDataType data;// 数据元素}BTNode;结构说明data存储节点数据字符类型left指向左子节点的指针right指向右子节点的指针3. 二叉树构建过程3.1 手动构造二叉树BTNode*CreateTree(){BTNode*nodeaBuyBTNode(a);BTNode*nodebBuyBTNode(b);BTNode*nodecBuyBTNode(c);BTNode*nodedBuyBTNode(d);BTNode*nodeeBuyBTNode(e);BTNode*nodefBuyBTNode(f);nodea-leftnodeb;nodea-rightnodec;nodeb-leftnoded;nodeb-rightnodee;nodec-rightnodef;returnnodea;}3.2 构造的二叉树结构a / \ b c / \ \ d e f4. 遍历实现思路4.1 前序遍历Pre-order Traversal访问顺序根节点 → 左子树 → 右子树voidPreorder(BTNode*root){if(rootNULL){printf(NULL );return;}printf(%c ,root-data);// 1. 访问根节点Preorder(root-left);// 2. 递归遍历左子树Preorder(root-right);// 3. 递归遍历右子树}前序遍历结果a b d e c f4.2 中序遍历In-order Traversal访问顺序左子树 → 根节点 → 右子树voidInorder(BTNode*root){if(rootNULL){printf(NULL );return;}Inorder(root-left);// 1. 递归遍历左子树printf(%c ,root-data);// 2. 访问根节点Inorder(root-right);// 3. 递归遍历右子树}中序遍历结果d b e a c f4.3 后序遍历Post-order Traversal访问顺序左子树 → 右子树 → 根节点voidPostorder(BTNode*root){if(rootNULL){printf(NULL );return;}Postorder(root-left);// 1. 递归遍历左子树Postorder(root-right);// 2. 递归遍历右子树printf(%c ,root-data);// 3. 访问根节点}后序遍历结果d e b f c a5. 递归执行过程图解5.1 前序遍历递归展开图Preorder(a) ├── printf(a ) // 访问根节点a ├── Preorder(b) │ ├── printf(b ) // 访问节点b │ ├── Preorder(d) │ │ ├── printf(d ) // 访问叶子节点d │ │ ├── Preorder(NULL) → 打印NULL并返回 │ │ └── Preorder(NULL) → 打印NULL并返回 │ └── Preorder(e) │ ├── printf(e ) // 访问叶子节点e │ ├── Preorder(NULL) → 打印NULL并返回 │ └── Preorder(NULL) → 打印NULL并返回 └── Preorder(c) ├── printf(c ) // 访问节点c ├── Preorder(NULL) → 打印NULL并返回 └── Preorder(f) ├── printf(f ) // 访问叶子节点f ├── Preorder(NULL) → 打印NULL并返回 └── Preorder(NULL) → 打印NULL并返回输出结果a b d NULL NULL e NULL NULL c NULL f NULL NULL5.2 中序遍历递归展开图Inorder(a) ├── Inorder(b) │ ├── Inorder(d) │ │ ├── Inorder(NULL) → 打印NULL并返回 │ │ ├── printf(d ) // 访问叶子节点d │ │ └── Inorder(NULL) → 打印NULL并返回 │ ├── printf(b ) // 访问节点b │ └── Inorder(e) │ ├── Inorder(NULL) → 打印NULL并返回 │ ├── printf(e ) // 访问叶子节点e │ └── Inorder(NULL) → 打印NULL并返回 ├── printf(a ) // 访问根节点a └── Inorder(c) ├── Inorder(NULL) → 打印NULL并返回 ├── printf(c ) // 访问节点c └── Inorder(f) ├── Inorder(NULL) → 打印NULL并返回 ├── printf(f ) // 访问叶子节点f └── Inorder(NULL) → 打印NULL并返回输出结果NULL d NULL b NULL e NULL a NULL c NULL f NULL5.3 后序遍历递归展开图Postorder(a) ├── Postorder(b) │ ├── Postorder(d) │ │ ├── Postorder(NULL) → 打印NULL并返回 │ │ ├── Postorder(NULL) → 打印NULL并返回 │ │ └── printf(d ) // 访问叶子节点d │ ├── Postorder(e) │ │ ├── Postorder(NULL) → 打印NULL并返回 │ │ ├── Postorder(NULL) → 打印NULL并返回 │ │ └── printf(e ) // 访问叶子节点e │ └── printf(b ) // 访问节点b ├── Postorder(c) │ ├── Postorder(NULL) → 打印NULL并返回 │ ├── Postorder(f) │ │ ├── Postorder(NULL) → 打印NULL并返回 │ │ ├── Postorder(NULL) → 打印NULL并返回 │ │ └── printf(f ) // 访问叶子节点f │ └── printf(c ) // 访问节点c └── printf(a ) // 访问根节点a输出结果NULL NULL d NULL NULL e b NULL NULL f c a6. 核心要点总结6.1 递归三要素递归终止条件节点为空时停止当前层操作打印节点数据递归调用分别调用左子树和右子树的遍历函数6.2 三种遍历的区别遍历方式访问顺序输出结果前序遍历根→左→右a b d e c f中序遍历左→根→右d b e a c f后序遍历左→右→根d e b f c a6.3 时间复杂度分析时间复杂度O(n)每个节点恰好被访问一次空间复杂度O(h)递归栈的深度h为树的高度7. 代码优化建议去掉NULL打印实际应用中通常不需要打印NULL非递归实现使用栈模拟递归过程层序遍历使用队列实现广度优先遍历文档说明本文档基于代码实现详细解释了二叉树三种遍历方式的递归思路和执行过程。
延伸阅读

更多相关文章

2026/9/23 17:55:54

信守不渝,以过程受控保障结果可靠

对于电力设备用绝缘部件,任何一次质量事故都可能导致灾难性的运行故障。因此,质量管理体系的有效性,是我们在选择供应商时最核心的考察红线。我们深度审查了所有候选供应商的质量文件,并进行了多次突击现场审核。结果令人担忧&…

2026/9/24 23:17:32

Camunda 7服务任务5种实现方式详解:从Java Class到External Task

做流程引擎这块的朋友,应该都有过类似的经历:第一次在 BPMN 模型里拖出一个 Service Task,选中它之后打开属性面板,看着 Java Class、Expression、Delegate Expression、External Task、Connector 这几个选项,心里没底…

2026/9/24 23:17:32

AI辅助软件测试实战:从用例生成到缺陷分析的全流程指南

1. 先盘一盘:AI到底能在软件测试里干什么这几年只要聊到软件测试,三句话离不开AI。团队里有人焦虑“AI会不会把测试岗位干掉”,也有人天天拿AI写用例、刷接口,效率确实翻倍。我自己的判断是:AI目前还替代不了测试工程师…

2026/9/24 23:17:32

基于个人信息自动生成定制密码字典:Python脚本设计实战

做授权渗透测试和红队评估的朋友,大概率都遇到过这种场景:目标资产的弱口令问题摆在那里,用通用字典跑一遍,rockyou那几十G的字典砸下去,出结果全靠运气。但你手上其实握着最优质的信息源——目标的姓名拼写、生日、手…

2026/9/24 23:17:32

异常断电硬盘“猝死”?Victoria坏道检测与修复实战

异常断电,硬盘真的会猝死吗?Victoria坏道检测与修复实战这话我平时不爱说,但每次有朋友慌慌张张跑来问“硬盘咔咔响是不是废了”的时候,我心里都挺无奈的。异常断电导致硬盘出问题,太常见了,尤其是在老小区…

2026/9/24 23:12:32

Tableau LOD函数详解:FIXED/INCLUDE/EXCLUDE实战

在Tableau里做了好几年数据分析,我遇到的第一个真正让人头疼的问题,不是图表不好看,而是“明明想算每个客户的总消费,但拖出来的数字总感觉不对”。换成区域维度,指标变了;换成订单维度,数字又变…

2026/9/24 20:24:47

GAMP 5 基于风险的计算机化系统验证:软件分类与审计追踪实践

简介:《A Risk-Based Approach to Compliant GxP Computerized Systems》即业内熟知的GAMP 5指南,面向制药企业质量与IT合规人员、验证工程师及计算机化系统管理者,用于解决GxP法规环境下系统合规性难以科学落地的问题。文档以风险管理为主线…

2026/9/23 12:06:55

安全托管MSSP实战:从静态防御到人机协同的攻防运营与应急响应

简介:这份PPT围绕互联网业务安全托管服务展开,面向企业安全负责人、IT运维人员及关注MSSP/MSS选型的读者,重点回应传统安全过度依赖人工、碎片化静态防御难以对抗产业化攻击等痛点。资源共1个pptx文件,包体约30.63MB,以…

2026/9/24 0:00:21

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为…

2026/9/24 0:00:21

单细胞注释实战:基于Scanpy的标记基因与参考映射流程解析

简介:一份基于单细胞RNA测序数据的细胞类型注释算法研究Python毕业设计源码,针对计算机相关专业正在做毕设或需要项目实战的学习者,可用于课程设计与期末大作业。项目代码完整、经导师指导评审通过,可直接运行,覆盖数据…

2026/9/24 0:00:21

C#源生成器实战:用增量生成器替代反射,告别AOT崩溃

第一次在项目里被反射卡住,是在一个老旧的WinForms模块里:几十个类依赖PropertyChanged通知,运行时反射读属性、发通知,每次启动慢半拍不说,一上.NET Native/AOT裁剪模式几乎全面崩盘。后来我把这段逻辑全部改成C#源生…

2026/9/22 16:34:32

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/22 20:01:30

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/22 13:25:41

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码