跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
C算法

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

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

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

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 遍历示例

更多推荐文章

查看全部
  • 鸿蒙金融理财全栈项目:基础架构、数据安全与用户体验
  • Spring 依赖注入的三种实现方式
  • 2026年全球AI大模型深度研究报告
  • AI 并非前端 UI 的终结者,而是效率加速器
  • DeepSeek-R1 模型 Python 爬虫实战:智能数据采集与清洗
  • Python AKshare 金融数据获取实战:股票基金期货全市场数据
  • 基于大疆 MSDK 的无人机视觉引导自适应降落实现
  • Python 深浅拷贝详解:原理、实现与适用场景
  • AIGC 内容创作:AI 文字、图像、音频和视频的创作流程
  • 发型设计 APP:基于 GLM-4.6V-Flash-WEB 的脸型适配剪发推荐
  • AI 时代,写作为何成为比编程更核心的元技能
  • Spring Cloud 2025.1 与 Spring Boot 4 核心变化及开发实践
  • FPGA 中 RS485 收发器应用与毛刺处理方案
  • 2026 国内 AI 编程套餐对比:计费坑与模型选择参考
  • VS Code 配置 C/C++ 编程运行环境
  • Windows 10 部署 OpenClaw 本地 AI 助手
  • 前端安全实战:密码加密、XSS 与 CSRF 防护指南
  • Claude Code 模型参数配置与实战指南
  • 2026 年 3 月 AI 前沿动态:模型、工具与硬件突破
  • HarmonyOS 应用开发:常见布局 Row 和 Column

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如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