【数据结构】链式二叉树全方位实现:遍历+节点计算+销毁+层序遍历保姆级教程
一、前置准备文件结构与核心定义我们采用多文件工程实现整体文件结构如下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/22 11:45:43阅读更多 →
从零开始掌握 OpenCV:发展历程、核心应用与 Python 环境搭建

从零开始掌握 OpenCV:发展历程、核心应用与 Python 环境搭建

目录 什么是 OpenCV?为什么选择 Python 来学习 OpenCV?OpenCV 能做什么? 丰富的应用案例 本系列笔记将涵盖哪些内容?Windows 下 Python 环境搭建步骤 第一步:下载并安装 Python第二步:验证 Python 安装第三…

2026/7/21 21:15:34阅读更多 →
Drain3配置秘籍:优化sim_th与max_clusters参数提升日志聚类准确率

Drain3配置秘籍:优化sim_th与max_clusters参数提升日志聚类准确率

Drain3配置秘籍:优化sim_th与max_clusters参数提升日志聚类准确率 【免费下载链接】Drain3 A robust streaming log template miner based on the Drain algorithm 项目地址: https://gitcode.com/gh_mirrors/dr/Drain3 Drain3是一个基于Drain算法的强大流式…

2026/7/21 19:44:33阅读更多 →
第01章 初识C语言

第01章 初识C语言

第1章 初识C语言 章节摘要 本章将带你走进C语言的世界,了解C语言的历史、特点和应用领域,搭建开发环境,编写第一个C程序,理解编译过程,为后续深入学习打下坚实基础。 1.1 C语言的诞生与发展历史 C语言的诞生 C语言由**…

2026/7/22 13:44:17阅读更多 →
K 个一组翻转链表

K 个一组翻转链表

K 个一组翻转链表 题目 给你链表的头节点 head ,每 k 个节点一组进行翻转,请你返回修改后的链表。 k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。 你不能只…

2026/7/22 13:44:17阅读更多 →
【Runway动作捕捉黄金配置清单】:NVIDIA RTX 6000 Ada + Intel i9-14900K + 专业红外校准套件实测报告

【Runway动作捕捉黄金配置清单】:NVIDIA RTX 6000 Ada + Intel i9-14900K + 专业红外校准套件实测报告

更多请点击: https://intelliparadigm.com 第一章:Runway动作捕捉黄金配置的定义与演进脉络 “Runway动作捕捉黄金配置”并非官方术语,而是社区实践中逐步沉淀出的一套兼顾精度、实时性、兼容性与部署成本的最优软硬件协同方案。其核心目标…

2026/7/22 13:44:17阅读更多 →
Cursor:从通用大模型到专业编程Agent的工程化实践

Cursor:从通用大模型到专业编程Agent的工程化实践

1. 从通用模型到专业编程助手的进化之路 在AI编程助手领域,Cursor的出现标志着一个重要转折点——它成功将一个通用大语言模型转化为具有专业编程能力的智能体(Agent)。这种转化不是简单的功能叠加,而是通过系统性的工程化改造实现…

2026/7/22 13:44:16阅读更多 →
Unreal Engine动态资源加载:PakLoaderPlugin插件详解与实战

Unreal Engine动态资源加载:PakLoaderPlugin插件详解与实战

1. 项目概述:PakLoaderPlugin是什么,以及它为何重要 如果你在Unreal Engine项目开发中,尤其是在移动端或者需要热更新、DLC(可下载内容)的场景下,被资源加载和管理问题折磨过,那么PakLoaderPlug…

2026/7/22 13:44:16阅读更多 →
算法竞赛核心技巧:从问题识别到工程优化的实战指南

算法竞赛核心技巧:从问题识别到工程优化的实战指南

在算法竞赛和工程实践中,很多题目虽然看起来复杂,但背后往往由几个核心算法模块组合而成。第二届CACC总决赛的标准算法题就体现了这一特点,题目设计既考察基础算法的掌握程度,又要求选手能够灵活组合这些算法解决实际问题。 实际…

2026/7/22 13:42:16阅读更多 →
Go语言静态资源打包方案对比与实践指南

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

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

2026/7/22 0:53:59阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

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

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

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

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

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

2026/7/22 0:53:59阅读更多 →
中小企业小程序开发公司怎么选:预算、上手和售后避坑指南

中小企业小程序开发公司怎么选:预算、上手和售后避坑指南

中小企业做小程序,最常见的矛盾是预算有限,但又不希望功能太单薄;没有技术团队,但又希望后续能自己运营;想快速上线,又担心隐性收费和售后失联。选型时如果只看“低价套餐”或“案例数量”,很容…

2026/7/22 0:01:17阅读更多 →
GEO优化如何沉淀长期内容资产?广拓时代谈AI搜索时代的内容ROI

GEO优化如何沉淀长期内容资产?广拓时代谈AI搜索时代的内容ROI

企业做营销,最怕钱花完了,资产没有留下。 效果广告能带来一段时间的曝光,但预算停止后,流量往往也随之停止。短视频内容可能在几天内冲高,也可能很快沉下去。AI搜索时代,企业需要重新思考一个问题&#xff…

2026/7/22 0:01:17阅读更多 →
Agent 终态判定:何时该停止思考、给出最终回复

Agent 终态判定:何时该停止思考、给出最终回复

Agent 终态判定:何时该停止思考、给出最终回复 一、你的 Agent 在"再想想"的循环里绕了 12 轮,用户已经关窗口了 Agent 与人最大的区别是:人知道什么时候该停下来给答案,Agent 会一直"想"下去。你给 Agent 接…

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

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

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

2026/7/21 22:53:50阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

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

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

2026/7/21 18:53:30阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

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

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

2026/7/21 18:53:30阅读更多 →