【数据结构】链式二叉树全方位实现:遍历+节点计算+销毁+层序遍历保姆级教程
一、前置准备文件结构与核心定义我们采用多文件工程实现整体文件结构如下1Tree.h二叉树结构体定义所有接口声明2Tree.c二叉树所有接口的具体实现3Queue.c/Queue.h队列的实现用于层序遍历。队列的实现方法在我的往期博客写过这里就不多过多赘述。4test.c功能测试代码1.1二叉树结构体定义Tree.h1. 链式二叉树的核心是节点指针1. 每个节点保存自身数据同时用两个指针分别指向左、右孩子节点2. 节点在内存中零散分布通过指针建立父子关联不需要连续内存适配任意形态的二叉树3. typedef 重命名为 BTNode 简化后续代码书写。1.2队列改造层序遍历的前置准备层序遍历需要借助队列实现但原本的队列默认存储 int 类型现在需要存储二叉树节点指针。如果直接在 Queue.h 中包含 Tree.h 会造成头文件循环包含Tree.h包含Queue.hQueue.h又包含Tree.h导致编译报错。解决方案结构体前置声明记得要注释掉Queue.h中原先给int起的别名并且要在tree.h中包含Queue.h。1. struct BinaryTreeNode 只是声明结构体名称不引入完整定义既让编译器认可「这是一个结构体指针类型」又避免了循环包含2. 队列存储的是二叉树节点的地址而非节点本身通过指针即可访问节点的左右孩子完美适配层序遍历的入队逻辑。二、二叉树的基础创建2.1节点申请函数BuyNode在test.c中实现即可1. 用 malloc 在堆区申请一块节点大小的内存初始化数据和左右指针2. 左右指针默认置空避免野指针3. 封装成函数后创建节点只需要调用 BuyNode(数据) 代码复用性更强。2.2手动构建测试二叉树为了方便测试接口我们手动创建一棵固定结构的二叉树三、二叉树的四大遍历方式遍历是二叉树最基础、最重要的操作核心思想是递归分治把整棵树拆成「根节点左子树右子树」子树重复同样的遍历逻辑。3.1前序遍历根左右访问顺序根节点-左子树-右子树按照我们给出的二叉树来看前序遍历结果应该是A B D NULL NULL E NULL NULL C F NULL NULL NULL1. 递归必须有终止条件节点为空时停止递归否则会无限调用导致栈溢出2. 遵循「根左右」的顺序先打印当前节点再递归遍历左子树最后递归右子树3. 空节点打印 NULL 方便调试时观察树的结构。3.2中序遍历左根右访问顺序左子树-根节点-右子树按照我们给出的二叉树来看中序遍历结果应该是NULL D NULL B NULL E NULL A NULL F NULL C NULL3.3后序遍历左右根访问顺序左子树-右子树-根节点按照我们给出的二叉树来看中序遍历结果应该是NULL NULL D NULL NULL E B NULL NULL F NULL C A三种递归遍历的核心区别根节点的访问时机不同左子树永远先于右子树访问。3.4层序遍历队列实现层序遍历是广度优先遍历从上到下从左到右逐层访问节点无法用递归天然实现必须借助队列先进先出完成。按照我们给的二叉树结构来实现层序遍历A B C D E F1. 利用队列「先进先出」的特性上一层节点按顺序入队出队时把自己的孩子入队天然保证逐层访问3. 每取出一个节点就把它的左右孩子依次入队保证下一层节点的顺序4. 遍历结束后必须销毁队列释放堆内存。四、二叉树核心计算接口所有计算接口均采用递归分治思想整棵树的结果 根节点的贡献 左子树结果 右子树结果。4.1二叉树总节点数整棵树的节点数 当前根节点1个 左子树的总节点数 右子树的总节点数空树返回0作为递归终止条件。4.2二叉树叶子节点数叶子节点左右孩子都为空的节点4.3二叉树第k层节点数层数同步递减当前节点在第1层它的孩子在子树中就是第k-1层递归到k1时说明到达目标层计数加1。4.4二叉树的深度/高度取左右子树更高的那一侧树的高度由更深的子树决定根节点本身占1层高度最终结果为左右子树高度的最大值加1。4.5查找值为x的节点1. 先判断当前节点是否为目标再递归查找左右子树2. 左子树找到后直接返回提前终止右子树的查找提升效率3. 找不到最终返回空指针。五、二叉树的销毁二级指针详解销毁二叉树必须采用后序遍历的顺序先销毁左子树、再销毁右子树、最后释放根节点。同时为了避免野指针销毁后需要把外部的根指针置空。为什么要用二级指针传root1一级指针是值传递函数内的 root 只是外部指针的拷贝修改形参不会影响外部实参2二级指针是地址传递通过 *root 可以直接修改外部原始指针变量释放内存后把外部指针置为NULL彻底杜绝野指针。六、功能测试与运行结果运行结果七、全文总结1. 链式二叉树通过节点左右指针实现适配任意形态的二叉树是最通用的二叉树存储方式2. 前/中/后序遍历基于递归分治思想核心区别是根节点的访问时机3. 层序遍历依托队列的先进先出特性实现需要改造队列存储节点指针并用前置声明避免头文件循环包含4. 节点计数、高度计算、节点查找均采用递归分治把大问题拆解为左右子树的子问题5. 二叉树销毁采用后序遍历二级指针释放内存同时置空外部指针避免野指针。

相关新闻

lm-evaluation-harness终极指南:全面掌握语言模型评估框架

lm-evaluation-harness终极指南:全面掌握语言模型评估框架

lm-evaluation-harness终极指南:全面掌握语言模型评估框架 【免费下载链接】lm-evaluation-harness A framework for few-shot evaluation of language models. 项目地址: https://gitcode.com/GitHub_Trending/lm/lm-evaluation-harness 在大语言模型快速发…

2026/7/21 17:40:25 阅读更多 →
全网热搜聚合 API:从 curl 快速验证到工程化封装

全网热搜聚合 API:从 curl 快速验证到工程化封装

适用场景 在社交媒体运营、舆情监控、内容聚合等场景中,常常需要获取多个平台的热门话题。全网热搜聚合 API 将微博热搜、知乎热榜、B 站日榜、百度贴吧热议合并为一次请求,降低多源数据获取的维护维护复杂度。研发人员可以在后端服务中调用该接口&…

2026/7/21 17:40:28 阅读更多 →
计算机毕业设计之基于SpringBoot的校园体育比赛管理系统的设计与实现

计算机毕业设计之基于SpringBoot的校园体育比赛管理系统的设计与实现

本世纪以来,随着越来越多的人使用网络,互联网得到了极大的发展,各种网络资源呈一个爆发性的增长,越来越多的人通过各种各样的网络工具,例如一些专业百度的官网,查询各种各样的信息,为了适应社会…

2026/7/21 17:40:28 阅读更多 →

最新新闻

Vim编辑器与Shell脚本编程高效技巧

Vim编辑器与Shell脚本编程高效技巧

1. Vim编辑器基础与核心操作Vim作为Linux系统中最强大的文本编辑器之一,其高效的操作方式让开发者又爱又恨。记得我第一次接触Vim时,面对黑屏界面完全不知所措,直到掌握以下核心操作才真正体会到它的魅力。1.1 三种模式解析Vim最独特的设计就…

2026/7/22 6:05:03 阅读更多 →
MCP 协议工程化开发指南:从基础原理到多智能体集成

MCP 协议工程化开发指南:从基础原理到多智能体集成

Model Context Protocol (MCP) 本质上是基于 JSON-RPC 2.0 规范的跨语言通信协议。简单来说,它就像是大模型与外部世界沟通的“通用 USB 接口”——通过标准化的契约,将底层的业务逻辑(如数据库查询、算法调用、甚至硬件控制)与大…

2026/7/22 6:05:03 阅读更多 →
TY-60H光纤熔接机 三防长续航,适配全品类能源基建光缆铺设

TY-60H光纤熔接机 三防长续航,适配全品类能源基建光缆铺设

一、能源数字化落地,光纤是能源安全通信关键载体当前国内电力、油气、新能源、矿山等能源行业全面推进数字化、智能化升级,光纤凭借抗电磁干扰、低时延、大容量的传输优势,成为能源生产调度、安全监测的核心通信载体。电网依托 OPGW、ADSS 光…

2026/7/22 6:05:03 阅读更多 →
鼎讯 JM-Q150 天馈线测试仪 风电野外作业观察

鼎讯 JM-Q150 天馈线测试仪 风电野外作业观察

在能源转型的大背景下,风电作为清洁能源的重要组成部分,正进入规模化快速发展阶段。风电场野外设备的信号传输与天线系统健康检测,一直是行业运维难点。传统测试设备体积偏大、操作繁琐、抗干扰性能有限,难以适配风电场复杂地形与…

2026/7/22 6:05:03 阅读更多 →
AI技术规格升级:从实验室到产业落地的实战指南

AI技术规格升级:从实验室到产业落地的实战指南

最近技术圈有个很有意思的现象:不少开发者朋友都在讨论一个话题——"规格一下就上来了"。这看似简单的一句话,背后其实反映了当前AI技术发展的一个关键转折点。过去我们评价一个AI项目或产品,往往关注的是模型参数规模、算力消耗这…

2026/7/22 6:05:03 阅读更多 →
中古木纹置物架✨拯救我的极简治愈系浴室

中古木纹置物架✨拯救我的极简治愈系浴室

装修奶油风、原木中古风的姐妹都知道!浴室五金是氛围感的终极分水岭😭 费尽心思选的柔光瓷砖、复古花砖、极简卫浴,结果装一个冷冰冰的银色不锈钢置物架,瞬间毁掉全屋温柔质感,廉价感直接拉满! 更头疼的是小…

2026/7/22 6:04:03 阅读更多 →

日新闻

TI DSP系统配置模块SYSCFG详解:中断机制与主设备优先级配置实战

TI DSP系统配置模块SYSCFG详解:中断机制与主设备优先级配置实战

1. 项目概述与SYSCFG模块的核心价值在嵌入式系统,尤其是像TI C6000系列这样的高性能DSP开发中,我们常常会与芯片手册里那些密密麻麻的寄存器打交道。很多开发者可能更关注算法实现、内存优化或者外设驱动,但对于一个稳定、高效的系统而言&…

2026/7/22 0:00:26 阅读更多 →
微信Server酱:高到达率的应急通知方案实践

微信Server酱:高到达率的应急通知方案实践

1. 为什么我们需要"最次"的通知方案? 在数字化协作环境中,消息通知系统的重要性不言而喻明。但现实情况是,企业级通知方案往往需要复杂的API对接(如企业微信、钉钉、飞书),个人开发者的小项目又经…

2026/7/22 0:00:26 阅读更多 →
甲方要的“简洁“PPT,到底是简洁还是省事?

甲方要的“简洁“PPT,到底是简洁还是省事?

甲方说"简洁一点",乙方听到的是"少做几页"。甲方说"不要太复杂",乙方理解成"别放图表了"。结果交过去,甲方说"我说的简洁不是这个意思"。"简洁"这个词在PPT语境里,是…

2026/7/22 0:00:26 阅读更多 →

周新闻

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

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

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

2026/7/21 8:48:31 阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

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

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

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

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

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

2026/7/21 8:25:39 阅读更多 →

月新闻