【数据结构】链式二叉树全方位实现:遍历+节点计算+销毁+层序遍历保姆级教程
一、前置准备文件结构与核心定义我们采用多文件工程实现整体文件结构如下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/26 21:49:36 阅读更多 →
全网热搜聚合 API:从 curl 快速验证到工程化封装

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

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

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

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

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

2026/7/26 21:49:39 阅读更多 →

最新新闻

微信防撤回补丁失效?逆向工程实战:从内存修改到开源方案

微信防撤回补丁失效?逆向工程实战:从内存修改到开源方案

1. 项目概述:当微信更新遇上防撤回补丁最近,不少热衷于使用微信PC版防撤回功能的朋友,可能都遇到了一个头疼的问题:微信更新到4.0.3.36版本后,之前用得好好的补丁突然失效了。消息撤回的提示框一闪而过,该被…

2026/7/27 7:31:26 阅读更多 →
得物App sign签名逆向:MD5加密常见错误与排查方案详解

得物App sign签名逆向:MD5加密常见错误与排查方案详解

1. 项目概述:为什么“得物sign签名”是逆向路上的第一道坎? 如果你正在尝试爬取得物App的商品、价格或评论数据,或者想研究其接口调用逻辑,那么“sign签名”这个参数绝对是你绕不开的第一座大山。它就像一道加密的门禁&#xff0c…

2026/7/27 7:31:26 阅读更多 →
AI视觉在超声波缺陷检测中的应用与优化

AI视觉在超声波缺陷检测中的应用与优化

1. 项目概述:超声波缺陷检测的AI视觉革命在工业无损检测领域,超声波检测一直是发现材料内部缺陷的黄金标准。但传统方法高度依赖操作人员的经验,就像医生看X光片一样,需要多年训练才能准确判断图像中的异常。我们团队开发的这套AI…

2026/7/27 7:31:26 阅读更多 →
分布式训练通信优化:Horovod与BytePS核心技术解析

分布式训练通信优化:Horovod与BytePS核心技术解析

1. 分布式训练通信优化概述在大规模机器学习训练场景中,单机单卡的训练模式已经无法满足日益增长的模型规模和数据集大小的需求。分布式训练通过将计算任务分配到多个计算节点上并行执行,显著提升了训练效率。然而,分布式训练中的通信开销往往…

2026/7/27 7:31:26 阅读更多 →
为什么你的提示词总在中性情绪上翻车?揭秘BERT+Prompt联合调优的6大隐性参数

为什么你的提示词总在中性情绪上翻车?揭秘BERT+Prompt联合调优的6大隐性参数

更多请点击: https://intelliparadigm.com 第一章:中性情绪翻车现象的本质归因 在现代软件工程实践中,“中性情绪翻车”并非心理学术语,而是开发者社区对一类隐蔽性技术失效的戏称——指系统在无明显错误日志、无异常抛出、无监控…

2026/7/27 7:31:26 阅读更多 →
从感官艺术展到交互装置:TouchDesigner与Max/MSP实战开发指南

从感官艺术展到交互装置:TouchDesigner与Max/MSP实战开发指南

在当代艺术与科技融合的浪潮中,感官体验的边界被不断拓宽。近期,一场名为“即兴生活家Doris的环球感官艺术实验”的展览引发了业界与公众的广泛关注。这不仅仅是一场艺术展,更是一次关于数据、交互与感知的深度技术实践。对于开发者、创意技术…

2026/7/27 7:30:26 阅读更多 →

日新闻

【JAVA毕设源码分享】基于SpringBoot的社区智能垃圾管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

【JAVA毕设源码分享】基于SpringBoot的社区智能垃圾管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/7/27 0:00:54 阅读更多 →
SPI实战指南:从时钟模式到寄存器配置,解决嵌入式通信难题

SPI实战指南:从时钟模式到寄存器配置,解决嵌入式通信难题

1. 项目概述:从寄存器手册到实战指南 如果你手头有一份类似德州仪器(TI)TMS320x240xA系列DSP的SPI模块技术手册,看着里面密密麻麻的寄存器位定义、时序图和公式,是不是感觉头大?这份资料虽然权威&#xff0…

2026/7/27 0:00:54 阅读更多 →
【JAVA毕设源码分享】基于springboot的水果购物管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

【JAVA毕设源码分享】基于springboot的水果购物管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/7/27 0:00:54 阅读更多 →

周新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/7/27 4:33:59 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/27 6:31:56 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

2026/7/27 4:01:12 阅读更多 →

月新闻