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

【数据结构】堆中插入数据,删除数据

1.堆中插入数据

堆插入数据我们是从尾部插入,插入数据不应该改变堆的性质(即不改变堆之前大堆或小堆的性质),比如在小堆时,如果插入的数据比插入位置的父结点小就不需要进行额外操作,但是如果插入的数据比插入位置的父结点大就需要进行相应调整,让其依然是小堆。

比如上图的堆要插入的数据是13,应该如何进行调整?

我们可以发现插入的数据只是对一条路上的数据有影响,我们只需要调整这一条路的数据即可。

调整的方法我们使用向上调整算法

1.通过插入位置坐标得到插入结点(我这里还是叫child)的父亲结点;

2.比较插入结点(child)和父亲结点,如果父亲结点大于插入的结点,将他们互换,反之跳出while

3.互换之后将当前原父亲结点的坐标赋值给child,再求出当前child的父亲结点,继续步骤2.

4.直到child=0循环结束

(插入之前还是老规矩,看看空间是否满了,满了需要扩容)

//向上调整
void AdjustUp(HPDataType* a, int n, int child)
{int parent = (child - 1) / 2;while (child > 0){if (a[child] < a[parent]){swap(&a[child], &a[parent]);child = parent;parent = (child - 1) / 2;}elsebreak;}
}//插入
void HeapPush(Heap* php, HPDataType x)
{assert(php);if (php->_capacity == php->_size){php->_capacity *= 2;HPDataType* tmp = (HPDataType*)realloc(php->_a, sizeof(HPDataType) * php->_capacity);if (tmp == NULL)  // 检查内存分配是否成功{printf("realloc failed\n");return;}php->_a = tmp;}php->_a[php->_size++] = x;AdjustUp(php->_a, php->_size, php->_size - 1);
}

2. 删除堆顶数据

1.将堆顶的数据和数组的最后一个数据互换;

2.再进行向下调整

向下调整算法可以参考这篇博客:

【数据结构】堆-“此堆非比堆”-CSDN博客

//删除堆顶数据
void HeapPop(Heap* php)
{assert(php);assert(php->_size > 0);swap(&php->_a[0], &php->_a[php->_size - 1]);php->_size--;AdjustDown(php->_a, php->_size, 0);
}

相关文章:
【数据结构】树的概念及结构-CSDN博客

【数据结构】二叉树概念及结构 -CSDN博客

http://www.dtcms.com/a/337172.html

相关文章:

  • Android Handler 线程执行机制
  • python遇到异常流程
  • 【Langchain系列二】LangChain+Prompt +LLM智能问答入门
  • Unix Domain Socket(UDS)和 TCP/IP(使用 127.0.0.1)进程间通信(IPC)的比较
  • Baumer高防护相机如何通过YoloV8深度学习模型实现网球运动员和网球速度的检测分析(C#代码UI界面版)
  • Spring AI Alibaba 项目接入兼容 OpenAI API 的大模型
  • Midjourney绘画创作入门操作创作(在线教育背景系列)
  • IOPaint 远程修图:cpolar 内网穿透服务实现跨设备图片编辑
  • Ansible文件部署与大项目多主机管理
  • 【Git】windows系统删除同名路径
  • 机器翻译论文阅读方法:顶会(ACL、EMNLP)论文解析技巧
  • IntelliJ IDEA中Maven的“Sync“与“Reload“详解:小白的避坑指南
  • python DataFrame基础操作
  • 从零开始部署经典开源项目管理系统最新版redmine6-Linux Debian12
  • 链路聚合路由器OpenMPTCProuter源码编译与运行
  • 如何在 Ubuntu 24.04 安装 Python 3.12 ?
  • SpringAI集成MCP
  • 详细探讨AI在金融、医疗、教育和制造业四大领域的具体落地案例,并通过代码、流程图、Prompt示例和图表等方式展示这些应用的实际效果。
  • 【金融数据分析】用Python对金融产品价格进行时间序列分解
  • MySQL的锁:
  • Python入门第9课:面向对象编程(OOP)从零开始,类、对象与三大特性
  • Leetcode 3650. Minimum Cost Path with Edge Reversals
  • Vue Router的常用API有哪些?
  • 05 定时器,延时器、递归、内置对象(Object 对象+Math 对象+Date 对象+String对象)
  • Less (CSS 预处理器)
  • 8.18网络编程——基于UDP的TFTP文件传输客户端
  • 后端通用基础代码
  • 电源电路介绍
  • OpenTelemetry、Jaeger 与 Zipkin:分布式链路追踪方案对比与实践
  • 窗口看门狗(WWDG)