当前位置: 首页 > news >正文

5、二叉树-小堆

🧱 什么是小堆?

小堆是一种完全二叉树,满足以下性质:

  • 每个节点的值都小于或等于它的左右子节点。
  • 最小值始终位于堆顶(根节点)。

🛠️ 构建小堆的步骤

假设我们有一个数组:

int a[] = {30, 20, 10, 25, 15, 40};

我们要将它构建成一个小堆。


🔍 Step 1:从最后一个非叶子节点开始调整

非叶子节点的最后一个下标是 (n - 2) / 2,这里是 (6 - 2) / 2 = 2,即下标为 2 的元素是 10

我们从下标 2 开始,向下调整每个节点,使其满足小堆性质。


🔄 Step 2:向下调整(AdjustDown)

✅ 调整下标为 2 的节点(值为 10)
  • 左子节点:下标 5,值为 40
  • 没有右子节点
  • 10 已经小于 40,无需调整
✅ 调整下标为 1 的节点(值为 20)
  • 左子节点:下标 3,值为 25
  • 右子节点:下标 4,值为 15
  • 右子节点更小 → 交换 20 和 15

数组变为:{30, 15, 10, 25, 20, 40}

继续向下调整下标 4(值为 20),它是叶子节点 → 停止

✅ 调整下标为 0 的节点(值为 30)
  • 左子节点:下标 1,值为 15
  • 右子节点:下标 2,值为 10
  • 右子节点更小 → 交换 30 和 10

数组变为:{10, 15, 30, 25, 20, 40}

继续向下调整下标 2(值为 30):

  • 左子节点:下标 5,值为 40
  • 没有右子节点
  • 30 已经小于 40 → 停止

✅ 最终小堆结构

数组:{10, 15, 30, 25, 20, 40}

对应的堆结构如下:

        10/  \15    30/  \     \25   20    40

每个父节点都小于或等于它的子节点,满足小堆性质。


代码实现

// 交换数据
void Swap(HPDataType* p1, HPDataType* p2)
{HPDataType tmp = *p1;*p1 = *p2;*p2 = tmp;
}
// 先把外部给我的数组变成堆,向下调整,前提是左右子树都是小堆
void AdjustDown(HPDataType* a, int n, int root)
{int parent = root;int child = 2*parent + 1;// 这里就是左孩子// 然后找出左孩子和又孩子之中最小的那个while(child < n){// child+1有可能越界if(child+1 < n && a[child + 1] < a[child]){// 此时最小的是child+1++child;}// 如果a[parent]小于a[child]if(a[child] < a[parent]){// 完成了数据的交换Swap(&a[parent], &a[child]);parent = child;child = 2*parent + 1;}else{break;}}}
// 初始化
void HeapInit(HP* php, HPDataType* a, int n)
{php->_a = (HPDataType*)malloc(sizeof(HPDataType)*n);memcpy(php->_a, a, sizeof(HPDataType)*n);php->_size = n;php->_capacity = n;// 构建堆,怎么把左右子树变成小堆// 从倒数第二个非叶子节点去调整for(int i = (n-1-1) / 2;i >= 0; --i){// 慢慢调整使得满足条件,左右子树都是小堆或者大堆AdjustDown(php->_a, php->_size, i);}}

文章转载自:

http://efM1LwI4.jcxgr.cn
http://S7CuAufL.jcxgr.cn
http://qPrCxjBu.jcxgr.cn
http://NsushDtt.jcxgr.cn
http://TfO0g5Gt.jcxgr.cn
http://BEp1B52m.jcxgr.cn
http://TowQoo2R.jcxgr.cn
http://lfnNldzX.jcxgr.cn
http://0rCknIFW.jcxgr.cn
http://caKytNSz.jcxgr.cn
http://lNYvV47d.jcxgr.cn
http://bMHdIlzn.jcxgr.cn
http://94Y5PYwi.jcxgr.cn
http://KnkHL3LA.jcxgr.cn
http://OINUZTuD.jcxgr.cn
http://nvE0d5rF.jcxgr.cn
http://rBNE0Ok1.jcxgr.cn
http://UBfWpI3T.jcxgr.cn
http://JRtMJWdY.jcxgr.cn
http://lgJAIDEj.jcxgr.cn
http://g4dlBk18.jcxgr.cn
http://5mZPGAoF.jcxgr.cn
http://HTaTlk8B.jcxgr.cn
http://ySyBKzgf.jcxgr.cn
http://WlT1gvtU.jcxgr.cn
http://w4aa6tZS.jcxgr.cn
http://6noPSfnC.jcxgr.cn
http://JyEkLz1n.jcxgr.cn
http://1i8498SQ.jcxgr.cn
http://7cEXC50G.jcxgr.cn
http://www.dtcms.com/a/385894.html

相关文章:

  • 技术奇点爆发周:2025 年 9 月科技突破全景扫描
  • 从Dubbo到SpringCloud Alibaba:大型项目迁移的实战手册(含成本分析与踩坑全记录)(一)
  • 【算法】C语言多组输入输出模板
  • 测试 Docker 的实时恢复功能
  • 系统中间件与云虚拟化-serverless-基于阿里云函数计算的云工作流CloudFlow设计与体验
  • springboot netty 客户端网络编程入门与实战
  • TCP/IP模型
  • 智慧用电安全管理系统的核心优势
  • flutter结合NestedScrollView+TabBar实现嵌套滚动
  • 基于定制开发开源AI智能名片S2B2C商城小程序的社群团购线上平台搭建研究
  • DEDECMS 小程序插件简介 2.0全新上线
  • 详解 Spring Boot 单元测试:@SpringBootTest 与 JUnit 依赖配置及环境注入
  • JMeter元件简介与JMeter测试计划
  • 陪诊小程序:让医疗关怀触手可及
  • n*n矩阵方程组Ax=b,使用Eigen矩阵库常用解法介绍
  • IvorySQL 4.6:DocumentDB+FerretDB 实现 MongoDB 兼容部署指南
  • UART,IIC,SPI总线(通信协议)
  • 记录一次小程序请求报错:600001
  • 光谱相机的新兴领域应用
  • GO学习记录十——发包
  • OpenLayers数据源集成 -- 章节十六:XML图层详解:OpenStreetMap数据的动态加载与智能样式渲染方案
  • vector 模拟实现 4 大痛点解析:从 memcpy 到模板嵌套的实战方案
  • tuple/dict/list 这三个数据类型在取值时候的区别
  • 用Python实现自动化的Web测试(Selenium)
  • Spring Boot 2.5.0 集成 Elasticsearch 7.12.0 实现 CRUD 完整指南(Windows 环境)
  • 第九章:使用Jmeter+Ant+Jenkins实现接口自动化测试持续集成
  • 使用IP的好处
  • 育碧确定《AC影》3月20日发售并分享系列游戏首发数据
  • 容器热升级机制在云服务器零停机部署中的实施规范
  • 贪心算法应用:时间序列分段(PAA)问题详解