二叉树的遍历与线索二叉树(哈喜老师)
1、二叉树的遍历1.1概念1.2先、中、后序遍历的递归代码#define_CRT_SECURE_NO_WARNINGS1#includestdio.h// 实现二叉链表结构的二叉树// 定义二叉树中结点的结构typedefstructBiTNode{intdata;// 数据域structBiTNode*lchild;// 指向左孩子的指针structBiTNode*rchild;// 指向右孩子的指针}BiTNode,*BiTree;// 前序遍历递归版本voidPreOrder(BiTree T)// T接收根结点的地址{if(T!NULL){// 空树不处理printf(%d ,T-data);// ① 访问根结点PreOrder(T-lchild);// ② 递归遍历左子树PreOrder(T-rchild);// ③ 递归遍历右子树}}// 中序遍历递归版本voidInOrder(BiTree T)// T接收根结点的地址{if(T!NULL){// 空树不处理InOrder(T-lchild);// ① 递归遍历左子树printf(%d ,T-data);// ② 访问根结点InOrder(T-rchild);// ③ 递归遍历右子树}}// 后序遍历递归版本voidPostOrder(BiTree T)// T接收根结点的地址{if(T!NULL){// 空树不处理PostOrder(T-lchild);// ① 递归遍历左子树PostOrder(T-rchild);// ② 递归遍历右子树printf(%d ,T-data);// ③ 访问根结点}}1.3利用队列实现二叉树的层次遍历Queue.h#pragmaonce#includestdio.h#includestdlib.h#includestdbool.hstructBiTNode;// 结构体类型的声明// 实现链式存储结构的队列(带头结点的版本)// 定义结点的结构结点用于存储队列中的元素typedefBiTNode*ElemType;// 队列中存储的数据类型是二叉树的结点的地址typedefstructLinkNode{ElemType data;structLinkNode*next;}LinkNode;// 定义队列的结构typedefstructLinkQueue{LinkNode*front;// 指向头结点的指针千万注意不是指向队头元素的指针LinkNode*rear;// 指向队尾元素的指针}LinkQueue;// 队列的初始化voidInitQueue(LinkQueueQ);// 队列是否为空。若为空返回true否则返回falseboolIsEmpty(LinkQueue Q);// 新元素x入队(即将新元素插到单链表的尾部)voidEnQueue(LinkQueueQ,ElemType x);// 队头元素出队(即删除第一个存储有效数据的结点),并将出队元素的值赋给变量xboolDeQueue(LinkQueueQ,ElemTypex);Queue.cpp#define_CRT_SECURE_NO_WARNINGS1#includeQueue.h// 队列的初始化voidInitQueue(LinkQueueQ){// 先申请一个头结点的空间// 初始化时指向头结点的指针与指向队尾元素的指针均指向头结点Q.frontQ.rear(LinkNode*)malloc(sizeof(LinkNode));Q.front-nextNULL;// 头结点中的next指针置为NULL}// 队列是否为空。若为空返回true否则返回falseboolIsEmpty(LinkQueue Q){if(Q.frontQ.rear)// 队列为空的条件既可以是Q.front Q.rear也可以是Q.front-next NULLreturntrue;elsereturnfalse;}// 新元素x入队(即将新元素插到单链表的尾部)voidEnQueue(LinkQueueQ,ElemType x){// 新元素x入队前先申请一个结点的空间用于存储新元素LinkNode*s(LinkNode*)malloc(sizeof(LinkNode));// s指向新结点s-datax;s-nextNULL;Q.rear-nexts;Q.rears;// 不要忘了让rear指针指向新的队尾元素}// 队头元素出队(即删除第一个存储有效数据的结点),并将出队元素的值赋给变量xboolDeQueue(LinkQueueQ,ElemTypex){if(Q.frontQ.rear)// 若队列为空则无法执行出队操作returnfalse;LinkNode*pQ.front-next;// p指向待出队的元素xp-data;// 将待出队元素的值赋给变量xQ.front-nextp-next;if(pQ.rear)// 注意如果队列中只有一个有效元素那么出队时需要修改队尾指针的值Q.rearQ.front;free(p);// 回收待出队元素的空间pNULL;returntrue;}BTree.h#define_CRT_SECURE_NO_WARNINGS1#includeQueue.h// 实现二叉链表结构的二叉树// 定义二叉树中结点的结构typedefstructBiTNode{intdata;// 数据域structBiTNode*lchild;// 指向左孩子的指针structBiTNode*rchild;// 指向右孩子的指针}BiTNode,*BiTree;// 利用队列实现二叉树的层序遍历voidLevelOrder(BiTree T);// T表示根结点的地址BTree.cpp重点看这个代码#define_CRT_SECURE_NO_WARNINGS1#includeBTree.h// 利用队列实现二叉树的层序遍历voidLevelOrder(BiTree T)// T表示根结点的地址{LinkQueue q;// 创建一个队列InitQueue(q);// 队列的初始化BiTree p;EnQueue(q,T);// 根结点入队while(!IsEmpty(q))// 队列不为空就进入循环{DeQueue(q,p);// 队头结点出队并将出队元素的值赋给pprintf(%d ,p-data);// 打印出队结点的值if(p-lchild!NULL)EnQueue(q,p-lchild);// 若p指向的结点的左孩子不为空则让左孩子入队if(p-rchild!NULL)EnQueue(q,p-rchild);// 若p指向的结点的右孩子不为空则让右孩子入队}}1.4由遍历序列构造二叉树1.4.1习题11.4.2习题2真题1.4.3习题3真题2、线索二叉树2.1线索二叉树的概念// 定义线索二叉树的结点结构typedefstructThreadNode{ElemType data;// 数据域存放结点的值structThreadNode*left,*right;// 左、右指针域intlTag,rTag;// lTag是左、rTag是右标志位0表示孩子指针1表示线索指针}ThreadNode,*ThreadTree;2.2构造线索二叉树2.3习题2.3.12010年题3比较容易显然选D。根据后序遍历序列为dbca以及后序线索二叉树的概念可知选D2.3.2习题二有难度

相关新闻

用Python和Tkinter打造桌面天气预报应用:从API获取到PyInstaller打包全攻略

用Python和Tkinter打造桌面天气预报应用:从API获取到PyInstaller打包全攻略

作为一个常年折腾各种自动化工具和桌面效率软件的人,我一直在找一个能随时看天气又不用开浏览器的方案。手机天气 App 确实方便,但很多时候我就坐在电脑前,为了查个天气还得解锁手机、找 App、看广告,效率属实不高。后来干脆自己动…

2026/9/24 21:48:57 阅读更多 →
宽频带瑞利阻尼标定方法:从两点法到最小二乘的工程实践

宽频带瑞利阻尼标定方法:从两点法到最小二乘的工程实践

对于做结构动力分析的人来说,“瑞利阻尼”这四个字几乎每天都会撞见。不管是地震作用下的时程分析,还是风振响应、设备振动、桥梁车激振动,总绕不开它。老实说,我以前一直把它当“标准配置”来用,直到有一次做一座大跨…

2026/9/24 21:48:56 阅读更多 →
C++访问者模式实战:双分派原理与std::variant选型指南

C++访问者模式实战:双分派原理与std::variant选型指南

如果你维护过那种实体类型不多、但操作一直在涨的C项目,你多半会在某个版本迭代里遇到一个很头疼的问题:为了让日志系统支持一个新类型,得去改基类;为了让序列化模块兼容一个字段,又得去动所有派生类。我最早碰到这个场…

2026/9/24 21:48:56 阅读更多 →

最新新闻

Java Web代驾系统源码设计与实践:从订单闭环到并发计费

Java Web代驾系统源码设计与实践:从订单闭环到并发计费

代驾系统源码这五个字,在各大代码仓库和资源站上一搜能出来几百个结果,但真正把订单从呼叫跑到支付闭环的项目屈指可数。我自己这两年用Java Web技术栈做过、也帮人改过几版代驾管理系统,最深的感受是:代驾系统这个题目&#xff0…

2026/9/24 23:57:39 阅读更多 →
Qwen3-ASR-1.7B本地部署实战:conda+FunASR+ModelScope全流程指南

Qwen3-ASR-1.7B本地部署实战:conda+FunASR+ModelScope全流程指南

Qwen3-ASR-1.7B发布之后,我一直想把它拉到本地跑一版。倒不是为了追新,而是手头有好几个不能传云端的音频要转文字,在线API要么有隐私顾虑,要么按分钟计费,越用越肉疼。折腾了两天,用conda把环境、依赖和模…

2026/9/24 23:57:39 阅读更多 →
JavaScript数组对象全解析:从Array到TypedArray、Set与Map

JavaScript数组对象全解析:从Array到TypedArray、Set与Map

数组这个问题,前端面试里几乎必考,但大多数人的认知都停在一个“会用方法”的层面。直到有人突然问一句:“JavaScript 数组的对象有哪些?”很多人当场愣住——这不就一个 Array 吗?还能有哪些?我第一次被问…

2026/9/24 23:57:39 阅读更多 →
Elasticsearch 8.x RESTful API 完全操作指南

Elasticsearch 8.x RESTful API 完全操作指南

开门见山说个事:如果你以前用的是 Elasticsearch 7.x,甚至还在用 6.x,现在直接对着 8.x 的文档敲命令,大概率会一脸懵。这个版本改动不是简单地加几个 API,而是把安全认证从"可选配置"改成了"默认强制&…

2026/9/24 23:57:39 阅读更多 →
【WorkBuddy从入门到精通实战教程】实战案例 第 58 章 行政:会议组织与差旅安排

【WorkBuddy从入门到精通实战教程】实战案例 第 58 章 行政:会议组织与差旅安排

【WorkBuddy从入门到精通实战教程】实战案例 第 58 章 行政:会议组织与差旅安排 一、行政的活儿,碎得让人抓狂 行政岗位的特点是:每件事都不难,但件数多、细节多、不能出错。 组织一场 30 人的季度会,要做的包括:协调时间、订会议室、准备物料、发通知、收集材料、安排…

2026/9/24 23:57:39 阅读更多 →
IGMP协议全解析:从组播原理到Wireshark抓包与故障排查

IGMP协议全解析:从组播原理到Wireshark抓包与故障排查

1. 组播的定位与IGMP在其中的角色先说一个我踩过的坑:刚接触IP组播的时候,我以为只要在路由器上敲几条命令、把组播路由协议一配,组播流量就能满网络跑起来。结果组播源发出数据后,接收端死活收不到包,排查了一下午&am…

2026/9/24 23:56:38 阅读更多 →

日新闻

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

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

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

2026/9/24 0:00:19 阅读更多 →
单细胞注释实战:基于Scanpy的标记基因与参考映射流程解析

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

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

2026/9/24 0:00:19 阅读更多 →
C#源生成器实战:用增量生成器替代反射,告别AOT崩溃

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

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

2026/9/24 0:00:19 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/24 14:34:13 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/24 9:10:42 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/24 14:33:56 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/24 12:50:34 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/24 14:33:48 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/24 12:49:17 阅读更多 →