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

数据结构——二叉树堆的专题

1.堆的概念及结构

如果有一个关键码的集合K = {K0 ,K1 ,K2 ,K3…,K(N-1) },把它的所有元素按完全二叉树的顺序存储方式存储 在一个一维数组中,并满足:Ki <= K2*i+1且 Ki<=K2*i+2 ) i = 0,1, 2…,则称为小堆(或大堆)。将根结点最大的堆叫做最大堆或大根堆根结点最小的堆叫做最小堆或小根堆

2.堆的性质

(1)堆中某个结点的值总是不大于或不小于其父结点的值; 

(2)堆总是一棵完全二叉树

3.堆的实现

1.第一种
 

/*向上调整算法(此代码适合大堆)*/
void xiangshang(int *a,int child)
{int parent = (child - 1) / 2;while (child > 0){if (a[parent] < a[child]){int c;c = a[parent];a[parent] = a[child];a[child] = c;}/*else{break;}*/child = parent;parent = (child - 1) / 2;}
}
/*建堆(此代码会建成大堆)*/
void jiandui(int *b,int n)
{for (int i = 0; i < n; i++){xiangshang(b, i);}
}

第一种建堆的具体讲解请看《四种排序方法的补充》 ,里面配有图文讲解,也有向上调整算法与向下调整算法(后面要用到)的图文讲解,希望你可以有耐心的看另一篇文章,希望我的这些讲解对你有用。

C--四种排序方法的补充-CSDN博客

2.第二种

1.创建堆所需要的模型

#include<iostream>
#include<stdlib.h>
#include<assert.h>
using namespace std;
typedef int HPDataType;
typedef struct Heap
{HPDataType* a;int size;int capacity;
}HP;

size是确定我开辟的空间中,用掉了多少空间。capacity是确定我开辟了多少个空间。 

2.堆的初始化

/*初始化*/
void Init(HP* ps)
{assert(ps);ps->a = NULL;ps->size = ps->capacity = 0;
}

3.堆的销毁

/*销毁*/
void Destroy(HP* ps)
{assert(ps);free(ps->a);ps->a = NULL;
}

这里要注意的是free(ps->a)之后,free(ps)是错误的操作。不可以销毁ps 

4.插入

/*插入(通过插入会形成大堆)*/
void HeapPush(HP* ps, HPDataType x)
{assert(ps);assert(x);if (ps->capacity == 0){HPDataType* b = (HPDataType*)malloc(sizeof(HPDataType) * 4);if (b == NULL){perror("malloc");exit(0);}ps->capacity = 4;ps->a = b;}if (ps->size == ps->capacity){HPDataType newcapacity = 2 * ps->capacity;HPDataType* b = (HPDataType*)realloc(ps->a, newcapacity * sizeof(HPDataType));if (b == NULL){perror("relloc");exit(0);}ps->a = b;ps->capacity = newcapacity;}ps->a[ps->size] = x;ps->size++;xiangshang(ps->a, ps->size - 1);
}

在插入之前我要先判断我是否开辟了空间,然后判断这个空间是否已经被填满。最后再将你所需要的数字放入到最后的位置,通过向上调整算法完成排序。 

 

5.删除元素

/*向下调整算法(此代码适合大堆)*/
void xiangxia(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]){int c;c = a[child];a[child] = a[parent];a[parent] = c;}parent = child;child = parent * 2 + 1;}
}
/*删除元素(此代码在删除元素后还是会形成大堆)*/
void HeapPop(HP* ps)
{assert(ps);assert(ps->size > 0);HPDataType b = ps->a[0];ps->a[0] = ps->a[ps->size - 1];ps->a[ps->size - 1] = b;ps->size--;xiangxia(ps->a, ps->size, 0);
}

删除元素删除的是根的元素,所以我先将根元素与最后的一个元素进行调换位置,然后让size--,(size--是因为下一次插入时,会将那个元素覆盖掉。)最后通过向下调整对这个堆重新排序,(注意:这个代码的前提是这个堆是大堆)让第二个大的坐到根的位置。

6.返还树根元素

/*返回树根元素*/
HPDataType HeapTop(HP* ps)
{assert(ps);assert(ps->size > 0);return ps->a[0];
}

 

7.判断是否为空

/*判断是否为空*/
bool HeapEmpty(HP* ps)
{return ps->size == 0;
}

因为当我初始化之后,size便是0,只有当插入元素之后,size才会大于或等于1。 

8.算多少个

/*算多少个数*/
int HeapSize(HP* ps)
{assert(ps);return ps->size;
}

9.打印树的内容

/*打印树的内容*/
void HeapPrintf(HP* ps,int size)
{int i = 0;for (; i < size; i++){printf("%d ", ps->a[i]);}
}

 

 

 

 

 

 

相关文章:

数据结构——二叉树堆的专题

1.堆的概念及结构 如果有一个关键码的集合K {K0 &#xff0c;K1 &#xff0c;K2 &#xff0c;K3…&#xff0c;K(N-1) }&#xff0c;把它的所有元素按完全二叉树的顺序存储方式存储 在一个一维数组中&#xff0c;并满足&#xff1a;Ki < K2*i1且 Ki<K2*i2 ) i 0&#…...

【C语言零基础入门篇 - 7】:拆解函数的奥秘:定义、声明、变量,传递须知,嵌套玩转,递归惊艳

文章目录 函数函数的定义与声明局部变量和全局变量、静态变量静态变量和动态变量函数的值传递函数参数的地址传值 函数的嵌套使用函数的递归调用 函数 函数的定义与声明 函数的概念&#xff1a;函数是C语言项目的基本组成单位。实现一个功能可以封装一个函数来实现。定义函数的…...

ClickHouse在AI领域的结合应用

文章目录 引言1.1 人工智能与大数据的融合1.2 ClickHouse在大数据平台中的地位2.1 BI与AI的融合从传统BI到智能BIAI赋能BI融合的优势实际应用案例 2.2 异构数据处理的重要性数据多样性的挑战异构数据处理的需求技术实现实际应用案例 2.3 向量检索与AIOps技术向量检索的背景AIOp…...

git push出错Push cannot contain secrets

报错原因&#xff1a; 因为你的代码里面包含了github token明文信息&#xff0c;github担心你的token会泄漏&#xff0c;所以就不允许你推送这些内容。 解决办法&#xff1a; 需要先把代码里面的github token信息删除掉&#xff0c;并且删掉之前的历史提交&#xff0c;只要包…...

OpenAI 的最强模型 o1 的“护城河”失守?谷歌 DeepMind 早已揭示相同原理

发布不到一周&#xff0c;OpenAI 的最新模型 o1 的“护城河”似乎已经失守。 近日&#xff0c;有人发现谷歌 DeepMind 早在今年 8 月发表的一篇论文&#xff0c;揭示了与 o1 模型极其相似的工作原理。 这项研究指出&#xff0c;在模型推理过程中增加测试时的计算量&#xff0c…...

【胡乱念叨】大模型的“我”

下面的内容很有可能事实错误&#xff0c;胡说八道&#xff0c;前后不连贯&#xff0c;举例随意且未经考证 甚至 有意欺骗&#xff01;嘻嘻。所以是【胡乱念叨】 文章目录 【胡乱念叨】大模型的“我”参数量和“我”什么是“我”从输入输出的观点看“我”大模型的“我”乱讨论 …...

Flag_AGtivity_clear_top网页编程指南如何退出多activity程序

activity的启动模式:FLAG_ACTIVITY_CLEAR_TOP和FLAG_ACTIVITY_REORDER_TO_FRONT。 1. 如果已经启动了四个Activity&#xff1a;A&#xff0c;B&#xff0c;C和D。在D Activity里&#xff0c;我们要跳到B Activity&#xff0c;同时希望C finish掉&#xff0c;可以在start…...

克隆centos网卡uuid相同如何修改

在克隆CentOS系统后&#xff0c;网卡的UUID相同会导致网络配置冲突&#xff0c;使得网络无法正常工作。要解决这个问题&#xff0c;你需要为每个克隆的系统生成新的UUID。 以下是解决步骤&#xff1a; 进入原始CentOS系统。 找到网络配置文件的位置&#xff0c;通常在 /etc/s…...

C语言习题~day11

1、C程序常见的错误分类不包含&#xff1a;&#xff08; &#xff09; A.编译错误 B.链接错误 C.栈溢出 D.运行时错误 栈溢出是运行时错误的一种&#xff0c;因此C程序不会将栈溢出错误单独列出来&#xff0c;栈溢出包含在运行时错误中。 因此&#xff1a;选择C 2、关于VS调…...

Ansible——Playbook基本功能???

文章目录 一、Ansible Playbook介绍1、Playbook的简单组成1&#xff09;“play”2&#xff09;“task”3&#xff09;“playbook” 2、Playbook与ad-hoc简单对比区别联系 3、YAML文件语法&#xff1a;---以及多个---&#xff1f;&#xff1f;使用 include 指令 1. 基本结构2. 数…...

多线程学习篇一:启动多线程的三种方式

1. 继承 Thread 类 Slf4j public class MyThread extends Thread {Overridepublic void run() {log.info("MyThread run ...");}public static void main(String[] args) {MyThread myThread new MyThread();myThread.start();} } 2. 实现 Runnable 接口 Slf4j pu…...

【专题】2024跨境出海供应链洞察-更先进供应链报告合集PDF分享(附原数据表)

原文链接&#xff1a;https://tecdat.cn/?p37665 当前&#xff0c;全球化商业浪潮促使跨境电商行业飞速发展&#xff0c;产业带与跨境电商接轨、平台半托管模式涌现、社交电商带来红利机会以及海外仓不断扩张&#xff0c;这使得产业带外贸工厂、内贸工厂、传统进出口企业和品…...

git submodule

git submodule 是 Git 提供的一种功能&#xff0c;用于在一个 Git 仓库中嵌套另一个 Git 仓库。它可以帮助管理和跟踪外部项目或依赖项&#xff0c;特别是在以下场景中非常有用&#xff1a; 1. 管理外部依赖 当你的项目依赖于其他外部项目或库时&#xff0c;可以使用 git sub…...

【Power Compiler手册】13.UPF多电压设计实现(3)

创建供电端口 要创建电源和地端口,请使用`create_supply_port`命令。 供电端口的名称应该是一个简单的(非层次化的)名称,并且在其定义的层次级别上是唯一的。除非指定了`-domain`选项,否则端口是在当前作用域或层次级别创建的,当前作用域中的所有电源域都可以使用创建的…...

RTX 4090 系列即将停产,RTX 5090 系列蓄势待发

据最新消息&#xff0c;英伟达将于今年10月正式终结其GeForce RTX 4090及RTX 4090D两款旗舰级显卡的生产线。根据行业媒体报道&#xff0c;英伟达及其合作厂商将从下个月开始全面停止这两款显卡的制造。 自2022年10月问世以来&#xff0c;GeForce RTX 4090凭借其无与伦比的GPU…...

【MySQL】使用C语言连接数据库

看到标题&#xff0c;可能会疑惑&#xff0c;我们学习的不是C吗&#xff0c;为什么使用C语言去连接数据库呢??实际上&#xff0c;这两种语言都可以连接数据库&#xff0c;但是C语言提供的API没有进行封装&#xff0c;更有利于我们学习数据库连接。面向API编程&#xff0c;哈哈…...

Vue学习记录之四(watch侦听器和watchEffect高级侦听器)

watch watch 用于侦听特定的响应式数据源&#xff08;如数据、计算属性等&#xff09;&#xff0c;比如ref或者是reactive时&#xff0c;并在其变化时执行回调函数。它适合用于处理副作用&#xff0c;如 API 请求或异步操作。使用 watch 适合特定数据变化的侦听&#xff0c;提…...

RedisTemplate操作ZSet的API

文章目录 ⛄概述⛄常见命令有⛄RedisTemplate API❄️❄️ 向集合中插入元素&#xff0c;并设置分数❄️❄️向集合中插入多个元素,并设置分数❄️❄️按照排名先后(从小到大)打印指定区间内的元素, -1为打印全部❄️❄️获得指定元素的分数❄️❄️返回集合内的成员个数❄️❄…...

Android 15 正式发布至 AOSP

Google官方宣布&#xff0c;将于近期发布了 Android 15&#xff0c;而在早些时候&#xff0c;Google已经将其源代码推送至 Android 开源项目 (AOSP)。未来几周内&#xff0c;Android 15 将在受支持的 Pixel 设备上正式推出&#xff0c;并将于今年晚些时候在三星、Honor、iQOO、…...

IEEE Electronic Library(IEL)数据库文献检索下载介绍及个人获取IEEE文献途径

一、数据库介绍 IEEE&#xff08;The Institute of Electrical and Electronics Engineers&#xff0c;电气电子工程师学会&#xff09;是目前全球最大的非营利性专业技术学会&#xff0c;在全球160多个国家拥有超过45万名会员。IEEE在电气电子、计算机、半导体、通讯、电力能…...

【入坑系列】TiDB 强制索引在不同库下不生效问题

文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...

理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端

&#x1f31f; 什么是 MCP&#xff1f; 模型控制协议 (MCP) 是一种创新的协议&#xff0c;旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议&#xff0c;它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...

连锁超市冷库节能解决方案:如何实现超市降本增效

在连锁超市冷库运营中&#xff0c;高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术&#xff0c;实现年省电费15%-60%&#xff0c;且不改动原有装备、安装快捷、…...

[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?

论文网址&#xff1a;pdf 英文是纯手打的&#xff01;论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误&#xff0c;若有发现欢迎评论指正&#xff01;文章偏向于笔记&#xff0c;谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...

uniapp微信小程序视频实时流+pc端预览方案

方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度​WebSocket图片帧​定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐​RTMP推流​TRTC/即构SDK推流❌ 付费方案 &#xff08;部分有免费额度&#x…...

图表类系列各种样式PPT模版分享

图标图表系列PPT模版&#xff0c;柱状图PPT模版&#xff0c;线状图PPT模版&#xff0c;折线图PPT模版&#xff0c;饼状图PPT模版&#xff0c;雷达图PPT模版&#xff0c;树状图PPT模版 图表类系列各种样式PPT模版分享&#xff1a;图表系列PPT模板https://pan.quark.cn/s/20d40aa…...

Angular微前端架构:Module Federation + ngx-build-plus (Webpack)

以下是一个完整的 Angular 微前端示例&#xff0c;其中使用的是 Module Federation 和 npx-build-plus 实现了主应用&#xff08;Shell&#xff09;与子应用&#xff08;Remote&#xff09;的集成。 &#x1f6e0;️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...

免费数学几何作图web平台

光锐软件免费数学工具&#xff0c;maths,数学制图&#xff0c;数学作图&#xff0c;几何作图&#xff0c;几何&#xff0c;AR开发,AR教育,增强现实,软件公司,XR,MR,VR,虚拟仿真,虚拟现实,混合现实,教育科技产品,职业模拟培训,高保真VR场景,结构互动课件,元宇宙http://xaglare.c…...

FFmpeg:Windows系统小白安装及其使用

一、安装 1.访问官网 Download FFmpeg 2.点击版本目录 3.选择版本点击安装 注意这里选择的是【release buids】&#xff0c;注意左上角标题 例如我安装在目录 F:\FFmpeg 4.解压 5.添加环境变量 把你解压后的bin目录&#xff08;即exe所在文件夹&#xff09;加入系统变量…...

掌握 HTTP 请求:理解 cURL GET 语法

cURL 是一个强大的命令行工具&#xff0c;用于发送 HTTP 请求和与 Web 服务器交互。在 Web 开发和测试中&#xff0c;cURL 经常用于发送 GET 请求来获取服务器资源。本文将详细介绍 cURL GET 请求的语法和使用方法。 一、cURL 基本概念 cURL 是 "Client URL" 的缩写…...