跳到主要内容
极客日志极客日志
首页博客AI提示词GitHub精选代理工具
搜索
|注册
博客列表
C算法

数据结构:堆与链式二叉树核心解析

综述由AI生成堆作为特殊的完全二叉树,分为大根堆与小根堆,利用数组下标公式高效定位父子节点。链式二叉树通过指针域构建节点关系,支持前序、中序及后序递归遍历。详细阐述了堆的定义性质与数组实现接口,并演示了二叉树遍历的逻辑流程与典型输出结果,帮助理解底层数据结构的核心机制。

邪神洛基发布于 2026/3/26更新于 2026/5/44 浏览
数据结构:堆与链式二叉树核心解析

1. 堆的概念和定义

1.1 堆

堆本质上是一种特殊的完全二叉树。根据根节点的大小关系,通常分为大根堆和小根堆。

  • 大根堆(大顶堆):任意父节点的值都不小于其子节点的值,根节点最大。
  • 小根堆(小顶堆):任意父节点的值都不大于其子节点的值,根节点最小。

关键性质在于:堆中某个结点的值总是不大于或不小于其父结点的值,且堆总是一棵完全二叉树。这意味着我们可以用数组来紧凑地存储堆结构,无需额外的指针开销。

1.2 二叉树的性质

对于有 n 个结点的二叉树,如果从上到下、从左到右从 0 开始依次编号,对于编号为 i 的结点有以下下标计算规律:

  • 父结点:(i - 1) / 2
  • 左孩子结点:2 * i + 1
  • 右孩子结点:2 * i + 2

若 2 * i + 1 或 2 * i + 2 大于等于 n,则说明该结点没有对应的左右孩子。

2. 堆的实现

在 C 语言中,我们通常使用动态数组配合结构体来封装堆的操作接口。以下是堆的基本结构定义及常用函数声明。

typedef int HPDataType;

typedef struct Heap {
    HPDataType* a;   // 底层数组
    int size;        // 当前元素个数
    int capacity;    // 当前容量
} HP;

// 默认初始化堆
void HPInit(HP* php);

// 利用给定数组初始化堆
void HPInitArray(HP* php, HPDataType* a, int n);

// 堆的销毁
void HPDestroy(HP* php);

// 堆的插入
void HPPush(HP* php, HPDataType x);

// 获取堆顶数据
HPDataType HPTop(HP* php);

// 删除堆顶的数据
void ;


 ;


 ;


 ;


 ;
HPPop
(HP* php)
// 判空
bool
HPEmpty
(HP* php)
// 求 size
int
HPSize
(HP* php)
// 向上调整算法
void
AdjustUp
(HPDataType* a, int child)
// 向下调整算法
void
AdjustDown
(HPDataType* a, int n, int parent)

实际实现时,AdjustUp 用于插入新元素后维护堆序性,而 AdjustDown 常用于建堆或删除堆顶后的调整。注意边界条件,避免数组越界。

3. 实现链式二叉树

3.1 链式二叉树的概念

用链表来表示一棵二叉树,即用链来指示元素的逻辑关系。通常的方法是链表中每个结点由三个域组成:数据域和左右指针域。左右指针分别用来给出该结点左孩子和右孩子所在的链结点的存储地址。

typedef int BTDataType;

// 二叉链
struct BinaryTreeNode {
    struct BinaryTreeNode* left;  // 指向当前结点左孩子
    struct BinaryTreeNode* right; // 指向当前结点右孩子
    BTDataType val;               // 当前结点值域
};

3.2 前中后遍历

按照规则,二叉树的遍历主要有三种递归结构:

  1. 前序遍历(Preorder Traversal):访问顺序为 根结点 -> 左子树 -> 右子树。
  2. 中序遍历(Inorder Traversal):访问顺序为 左子树 -> 根结点 -> 右子树。
  3. 后序遍历(Postorder Traversal):访问顺序为 左子树 -> 右子树 -> 根结点。

3.3 遍历示例

假设有一棵二叉树,根节点为 A,左子树包含 B、D,右子树包含 C、E、F。遍历时遇到空节点(NULL)表示该位置无子节点。具体输出如下:

  • 前序遍历(根左右):A, B, D, NULL, NULL, NULL, C, E, NULL, NULL, F, NULL, NULL
  • 中序遍历(左根右):NULL, D, NULL, NULL, B, A, NULL, E, NULL, C, NULL, F, NULL
  • 后序遍历(左右根):NULL, NULL, D, NULL, B, NULL, NULL, E, NULL, NULL, F, C, A

这里展示的是带空节点的完整序列,便于理解递归调用的路径。在实际应用中,通常只关注非空节点的访问顺序。

目录

  1. 1. 堆的概念和定义
  2. 1.1 堆
  3. 1.2 二叉树的性质
  4. 2. 堆的实现
  5. 3. 实现链式二叉树
  6. 3.1 链式二叉树的概念
  7. 3.2 前中后遍历
  8. 3.3 遍历示例
  • 💰 8折买阿里云服务器限时8折了解详情
  • GPT-5.5 超高智商模型1元抵1刀ChatGPT中转购买
  • 代充Chatgpt Plus/pro 帐号了解详情
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • 国内大模型市场发展现状、技术架构与人才需求分析
  • 动态规划实战:完全背包、零钱兑换与排列组合
  • PyTorch scatter() 与 scatter_() 用法详解
  • 万物工程化:工程思维与非技术岗位的融合趋势
  • AI 开发核心概念:Skill、MCP 与 Function Call 详解
  • Linux 下 Git 版本控制基础与常用命令实战
  • BaseCTF Week3 Web 与 Misc 解题思路
  • 基于 ECharts 与 Three.js 的前端碳排放可视化大屏实现
  • C++ 继承机制详解:从概念到多继承模型
  • macOS 下使用脚本安装 Homebrew 及配置国内镜像源
  • RabbitMQ 分布式系统实战:从安装部署到 C++ 客户端调用
  • 高鋒集團合夥人黃俊瑯:以資本與生態賦能傳統企業 Web3 轉型
  • 二分查找实战:旋转排序数组最小值与点名问题解析
  • AudioSeal 在 Whisper 生成音频中检测并提取原始水印
  • 前端开发必备的三个 AI 技能:提升 UI 设计、代码规范与硬件效率
  • C++ vector 常用成员函数的模拟实现
  • 前缀和技巧实战:和为 K 及可被 K 整除的子数组统计
  • 智能家居插件管理工具技术指南:本地化网络优化方案
  • 多模态模型开发实战:文本、图像与语音融合应用
  • 人工智能多模态模型开发与应用:文本图像语音融合实践

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online