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

【数据结构】二叉树之堆的实现

🔥博客主页:小王又困了

📚系列专栏:数据结构

🌟人之为学,不日近则日退

❤️感谢大家点赞👍收藏⭐评论✍️


目录

一、二叉树的顺序结构

📒1.1顺序存储

📒1.2堆的性质

📒1.3堆的分类

二、堆的实现

📒2.1堆的创建

📒2.2堆的初始化

📒2.3堆的插入

📒2.4向上调整数据

📒2.5堆的删除

📒2.6向下调整数据

📒2.7堆的销毁


🗒️前言:

在上一期的文章中我们学习了一些二叉树的知识,也了解了堆的概念。堆是一颗完全二叉树,分为大堆和小堆,今天我们将实现堆的各种功能。

一、二叉树的顺序结构

📒1.1顺序存储

顺序结构存储就是使用数组来存储,一般使用数组只适合表示完全二叉树,因为不是完全二叉树会有空间的浪费。而现实使用中只有堆才会使用数组来存储。二叉树顺序存储在物理上是一个数组,在逻辑上是一颗二叉树。

📒1.2堆的性质

  • 堆中某个节点的之总是不大于或不小于其父亲节点的值
  • 堆是一颗完全二叉树

📒1.3堆的分类

  • 小堆:树中任意一个父亲都小于等于孩子
  • 大堆:树中任意一个父亲都大于等于孩子

二、堆的实现

📒2.1堆的创建

堆的逻辑结构是树形结构,是我们想象出来的,实际上我们操作的数组,所以堆的创建和顺序表的结构相同。

typedef int HPDateType;
typedef struct Heap
{HPDateType* a;int size;int capacity;
}HP;

📒2.2堆的初始化

我们有两种初始化的方式,一种是在初始化阶段不开辟空间,在插入过程中进行扩容;另一种是在初始化阶段就开辟空间。

void HeapInit(HP* php)
{assert(php);php->a = NULL;php->size = 0;php->capacity = 0;
}
void HeapInit(HP* php)
{assert(php); php->size = 0;php->capacity = 5;php->a = (HPDateType*)malloc(sizeof(HPDateType) * capacity);if (tmp == NULL){perror("malloc");exit(-1);}
}

📒2.3堆的插入

堆是使用顺序结构的数组来存储的,我们使用尾插插入数据更方便,然后将数据调整到合适的位置。

4143c6b8ae344af89a1c07f578efa8b6.jpeg

void HeapPush(HP* php, HPDataType x)
{assert(php);// 扩容if (php->size == php->capacity){int newCapacity = php->capacity == 0 ? 4 : php->capacity * 2;HPDataType* tmp = (HPDataType*)realloc(php->a, sizeof(HPDataType) * newCapacity);if (tmp == NULL){perror("realloc fail");exit(-1);}php->a = tmp;php->capacity = newCapacity;}php->a[php->size] = x;php->size++;AdjustUp(php->a, php->size - 1);
}

如图:在小堆中插入50,50比它的父亲小,所以要交换两数的位置。我们知道孩子的下标通过 parent=(child-1)/2 就可以得到父亲的下标,然后交换两数。

📒2.4向上调整数据

如果是小堆存储我们通过孩子的下标找到父亲,比较两数如果孩子小于父亲就交换,然后在向上比较,如果孩子不小于父亲就跳出循环。

void Swap(HPDataType* p1, HPDataType* p2)
{HPDataType tmp = *p1;*p1 = *p2;*p2 = tmp;
}void AdjustUp(HPDataType* a, int child)
{int parent = (child - 1) / 2;while (child > 0){if (a[child] < a[parent]){Swap(&a[child], &a[parent]);child = parent;parent = (parent - 1) / 2;}else{break;}}
}

📒2.5堆的删除

我们使用挪动覆盖的方法删除根,会使关系混乱,剩下的值不一定是堆,而且效率很低。这里提供一种更好的方法,将根和最后一个值交换,然后删除,最后调整数据。

void HeapPop(HP* php)
{assert(php);assert(php->size > 0);Swap(&php->a[0], &php->a[php->size - 1]);--php->size;AdjustDown(php->a, php->size, 0);
}

这里要注意有数据的时候才能删除,所以要加入 assert(php->size > 0) 进行判断。

📒2.6向下调整数据

如果是小堆存储我们要找到左右孩子中较小的数,然后与父亲交换,再找到下一层重复步骤,直到找到叶节点结束。

void AdjustDown(HPDataType* a, int n, int parent)
{//默认左孩子是较小的int child = parent * 2 + 1;while (child < n){// 找出小的那个孩子if (child + 1 < n && a[child + 1] < a[child]){++child;}if (a[child] < a[parent]){Swap(&a[child], &a[parent]);// 继续往下调整parent = child;child = parent * 2 + 1;}else{break;}}
}

📒2.7堆的销毁

我们使用动态开辟内存,要及时释放空间并置为空指针,不然会造成数据泄露。

void HeapDestroy(HP* php)
{assert(php);free(php->a);php->a = NULL;php->size = php->capacity = 0;
}

本次的内容到这里就结束啦。希望大家阅读完可以有所收获,同时也感谢各位读者三连支持。文章有问题可以在评论区留言,博主一定认真认真修改,以后写出更好的文章。你们的支持就是博主最大的动力。

相关文章:

【数据结构】二叉树之堆的实现

&#x1f525;博客主页&#xff1a;小王又困了 &#x1f4da;系列专栏&#xff1a;数据结构 &#x1f31f;人之为学&#xff0c;不日近则日退 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 目录 一、二叉树的顺序结构 &#x1f4d2;1.1顺序存储 &#x1f4d2;1.2堆的性质…...

电工-三极管输入输出特性曲线讲解

三极管特性曲线是反映三极管各电极电压和电流之间相互关系的曲线&#xff0c;是用来描述晶体三极管工作特性曲线&#xff0c;常用的特性曲线有输入特性曲线和输出特性曲线。这里以下图所示的共发射极电路来分析三极管的特性曲线。 输入特性曲线 该曲线表示当e极与c极之间的电…...

深入解析容器与虚拟化:技术、对比与生态

深入解析容器与虚拟化&#xff1a;技术、对比与生态 文章目录 深入解析容器与虚拟化&#xff1a;技术、对比与生态容器和虚拟化的基本概念和原理容器的定义和特点虚拟化的定义和特点 容器使用场景容器和虚拟机的对比虚拟化技术的四个特点容器实现虚拟化的原理常见容器引擎和容器…...

制作游戏demo的心得

制作这个游戏demo出来的心得 https://www.bilibili.com/video/BV1cF411m7Dh/ 制作游戏demo的心得 制作游戏demo&#xff0c;主要是为了表现自己的技术&#xff0c;那就一门心思想着如何提高表现力就行了&#xff0c;在整体的画面渲染风格方面或许没有什么可选择的&#xff0c;…...

Web Tour Server窗口闪现

1.打开该文件所在位置 2.右击选择编辑&#xff0c;在最后一行加上pause&#xff0c;保存后重新打开Server窗口 3.重新打开后&#xff0c;若出现以下情况&#xff1a; 以管理员身份打开cmd命令行&#xff0c;输入命令netstat -aon|findstr “1080”&#xff0c;查看1080端口占用…...

Linux下的基本指令

目录 01. ls 指令 02. pwd命令 03. cd 指令 04. touch指令 05.mkdir指令&#xff08;重要&#xff09;&#xff1a; 06.rmdir指令 && rm 指令&#xff08;重要&#xff09;&#xff1a; 07.man指令&#xff08;重要&#xff09;&#xff1a; 08mv指令&#xff…...

随机数生成器代码HTML5

代码如下 <!DOCTYPE html> <html> <head> <title>随机数生成器</title> <meta name"viewport" content"widthdevice-width, initial-scale1.0"> <style> body { text-align: center; bac…...

正确理解redux Toolkits中createSlice的action.payload

使用redux Toolkits中的createSlice编写extraReducers经常看到使用action.payload来更新state状态值&#xff1a; 那么action.payload指的到底是什么&#xff1f; 让我们看看action的定义部分&#xff1a; 注意&#xff1a; action.payload不是上面ajax请求的返回内容&#x…...

YOLOv8快速复现 官网版本 ultralytics

YOLOV8环境安装教程.&#xff1a;https://www.bilibili.com/video/BV1dG4y1c7dH/ YOLOV8保姆级教学视频:https://www.bilibili.com/video/BV1qd4y1L7aX/ b站视频&#xff1a;https://www.bilibili.com/video/BV12p4y1c7UY/ 1 平台搭建YOLOv8 平台&#xff1a;https://www.a…...

Haproxy搭建 Web 群集实现负载均衡

目录 1 Haproxy 1.1 HAProxy的主要特性 1.2 HAProxy负载均衡策略 1.3 LVS、Nginx、HAproxy的区别 2 Haproxy搭建 Web 群集 2.1 haproxy 服务器部署 2.1.1 关闭防火墙 2.1.2 内核配置&#xff08;实验环境可有可无&#xff09; ​2.1.3 安装 Haproxy 2.1.4 Haproxy服务…...

Tessy 5.0.4

Tessy 5.0.4 Linux 2692407267qq.com&#xff0c;更多内容请见http://user.qzone.qq.com/2692407267/...

mybatis-plus根据指定条件批量更新

1.service实现类中 比如我这里只针对UserEntity&#xff0c;在UserServiceImpl下&#xff08;该实现类是继承了mybatis-plus的ServiceImpl的&#xff09;新增如下代码&#xff1a; public boolean updateBatchByQueryWrapper(Collection<UserEntity> entityList, Funct…...

虹科方案 | LIN/CAN总线汽车零部件测试方案

文章目录 摘要一、汽车零部件测试的重要性&#xff1f;二、虹科的测试仿真工具如何在汽车零部件测试展露头角&#xff1f;三、应用场景**应用场景1&#xff1a;方向盘开关的功能测试****应用场景2&#xff1a;各类型电机的控制测试****应用场景3&#xff1a;RGB氛围灯的功能测试…...

[solidity]合约调用合约

先写一个简单的合约将其部署&#xff0c;部署后的合约地址为&#xff1a;0xd9145CCE52D386f254917e481eB44e9943F39138 // SPDX-License-Identifier: MIT pragma solidity ^0.8.0;contract A{string myname;function setName(string memory _name) public{myname_name;}functi…...

Vulnhub系列靶机---JANGOW 1.0.1

文章目录 网卡配置信息收集主机发现端口扫描 漏洞利用反弹Shell提权 靶机文档&#xff1a;JANGOW 1.0.1 下载地址&#xff1a;Download (Mirror) 难易程度&#xff1a;. 网卡配置 水果味儿 信息收集 主机发现 端口扫描 访问80端口 点击site目录 点击页面上方的一个选项&…...

肖sir__项目环境之全流程__005

一、测试流程&#xff08;h模型&#xff09; 1、需求文档&#xff08;产品&#xff09; 需求文档&#xff08;软件需求规格说明书srs&#xff09; &#xff08;1&#xff09;如何分析需求 a、显示需求&#xff08;主流程、功能&#xff0c;业务&#xff09; b、隐性需求&#x…...

搜狗输入法下键翻页

搜狗输入法下键翻页 从官网下载 搜狗输入法智慧版关闭超级候选关闭候选...

C#多线程

一、多线程实现方式 1. 使⽤Thread类&#xff1a; System.Threading.Thread 类是C#中最基本的多线程编程⼯具。 2. 使⽤ThreadPool&#xff1a; 线程池是⼀个管理和重⽤线程的机制&#xff0c;它可以在应⽤程序中创建和使 ⽤多个线程&#xff0c;⽽⽆需显式地管理线程的…...

Unity 编辑器常用方法

unity编辑器开发 脚本注解1. RuntimeInitializeOnLoadMethod2. ColorUsage3. Header4. SerializeField5. HideInInspector6. Space7. Range8. Multiline9.[RequireComponent(typeof())]10.HelpURL 右键菜单注解1. CreateAssetMenu - 针对ScriptableObject 菜单栏注解1. MenuIt…...

21 mysql ref 查询

前言 这里主要是 探究一下 explain $sql 中各个 type 诸如 const, ref, range, index, all 的查询的影响, 以及一个初步的效率的判断 这里会调试源码来看一下 各个类型的查询 需要 lookUp 的记录 以及 相关的差异 此系列文章建议从 mysql const 查询 开始看 测试表结构…...

启山智软/一款包含主流商城类型的一款电商中台系统100%开源

文章目录 介绍一、Smart Shop JAVA 微服务电商中台优势二、电商中台包含那些主流商城模式1.S2B2C供应链商城2.B2B2C多商户商城3.B2C单商户商城4.O2O外卖配送商城5.社区团购商城 6.演示地址总结 介绍 想要了解代码规范&#xff0c;学习商城解决方案&#xff0c;点击下方官网链接…...

【C语言】指针的进阶(四)—— 企业笔试题解析

笔试题1&#xff1a; int main() {int a[5] { 1, 2, 3, 4, 5 };int* ptr (int*)(&a 1);printf("%d,%d", *(a 1), *(ptr - 1));return 0; } 【答案】在x86环境下运行 【解析】 &a是取出整个数组的地址&#xff0c;&a就表示整个数组&#xff0c;因此…...

博弈论——连续产量古诺模型

连续产量古诺模型 连续产量古诺模型是博弈论中非常经典的模型&#xff0c;以两厂商连续产量古诺博弈为例&#xff1a; 1、模型建立 Player&#xff1a;两个供应相同产品的厂商 产量&#xff1a;厂商1的产量为q1&#xff0c;厂商2的产量为q2&#xff0c;市场总供给为Qq1q2。…...

ROS2 驱动思岚G4雷达(ydlidar)- Rviz显示

记录G4雷达的配置 系统环境为&#xff1a;Ubuntu22.04 配置步骤 1、安装雷达SDK 2、构建 G4 雷达 ROS2 项目工程文件 3、使用Rviz可视化界面显示 1、安装雷达SDK 1.1 安装CMake YDLidar SDK需要CMake 2.8.2作为依赖项 Ubuntu 18.04或者Ubuntu 22.04 sudo apt install cmak…...

Spring Cloud Alibaba Sentinel流量防卫兵

文章目录 Spring Cloud Alibaba Sentinel流量防卫兵1. 分布式遇到的问题2.解决的方法 Sentinel: 分布式系统的流量防卫兵1. 简介和特折 Sentinel流量防卫兵的搭建1.引入依赖2.添加配置类3.运行类上添加SentinelResource&#xff0c;并配置blockHandler和fallback4. linux中放入…...

1.简单工厂模式

UML类图 代码 main.cpp #include <iostream> #include "OperationFactory.h" using namespace std;int main(void) {float num1;float num2;char operate;cin >> num1 >> num2 >> operate;Operation* oper OperationFactory::createOpera…...

GitHub Copilot Chat

9月21日&#xff0c;GitHub在官网宣布&#xff0c;所有个人开发者可以使用GitHub Copilot Chat。用户通过文本问答方式就能生成、检查、分析各种代码。 据悉&#xff0c;GitHub Copilot Chat是基于OpenAI的GPT-4模型打造而成&#xff0c;整体使用方法与ChatGPT类似。例如&…...

利用 QT 完成一个人脸识别系统,完成登录操作

1.配置文件 # Project created by QtCreator 2023-09-22T10:34:23 # #-------------------------------------------------QT core guigreaterThan(QT_MAJOR_VERSION, 4): QT widgetsTARGET project TEMPLATE appSOURCES main.cpp\widget.cppHEADERS widget.hFOR…...

MATLAB APP纯小白入门 两数相加

万事开头难&#xff0c;最怕第一次。使用matlab APP 实现两数求和&#xff0c;如下图所示&#xff0c;c a b&#xff0c;输入数字后&#xff0c;按 “” 就计算。 步骤 拖拽三个 Edit Field(Numeric) 过来&#xff0c;并且双击名字分别改为 a,b,c。注意修改名字后右边会有点变…...

ubuntu右上角的网络连接图标消失解决办法

ubuntu更新了几个文件后&#xff0c;我的ubuntu系统右上角的网络连接图标就消失了&#xff0c;然后怎么也找不到了&#xff0c;怎么办呢&#xff1f; 1、按快捷键ctrlaltt打开终端 2、按以下顺序输入如下的命令行 sudo service network-manager stop sudo rm /var/lib/Netw…...

新版lnmp安装wordpress/seo搜索引擎优化怎么做

拓扑&#xff1a; 加密点和通信点 加密点10.1.1.1---10.1.1.2&#xff0c;通信点&#xff0c;1.1.1.1-2.2.2.2 说明&#xff1a;看这篇文章的前提是 &#xff0c;你已经知道了怎么样申请证书。已经初步了解了证书的基本原理和一些域名的知识。这些细节&#xff0c;需要的可以百…...

动态网站建设试题/百度推广代理商名单

lua 函数 函数 语法格式 function_scope function function_name( argument1, argument2, argument3, ...)function_bodyreturn result_params_comma_separated end 相关说明 function_scope&#xff1a;函数作用域&#xff0c;全局或者local&#xff0c;不设置默认为全局 fu…...

O2O网站制作需要多少钱/长沙百度搜索排名优化

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 安全生产模拟考试一点通&#xff1a;2021年危险化学品生产单位安全生产管理人员考试题为正在备考危险化学品生产单位安全生产管理人员操作证的学员准备的理论考试专题&#xff0c;每个月更新的危险化学品生产单位安全…...

vs做网站怎么添加子页/网络推广网站程序

本章要讲的是PHP的全局变量。 这里讲个小故事: 很多年前&#xff0c;一个很聪明的小偷&#xff0c;想去偷一户人家的钱。可是他偷不到主人的钥匙&#xff0c;怎么办呢&#xff1f; 他想到了一个办法&#xff0c;去之前嚼了一块口香糖&#xff0c;口香糖的牌子是“大大泡泡糖”。…...

哪个网站可以做身份核验/上海网络seo公司

文章转自:http://blog.csdn.net/u012385432前面的几篇文章中提及了有关.Pak文件和文件下载的部分,这两部分组合起来,其实就是我们的资源热更新了.当然代码的热更新不在这个讨论范围内.代码的热更新的话就更加麻烦了.这次讨论的只限资源的热更新...前面文章链接:1.下载文件链接2…...

政府网站建设整改工作方案/免费建站平台

一次实验作业&#xff0c;记录一下过程和心得体会。用XML Spy工具开展Xpath语法练习 在实验过程中&#xff0c;主要参考了如下学习网站&#xff1a; 1. XPath 语法 2. [使用Xpath对XML进行模糊查询] - -梦里不知身是客 - 博客园 3. 菜鸟教程的也不错 在XML Spy中打开如下XM…...