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

news2024/9/20 5:08:49

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]);
	}
}

 

 

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2147955.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java语言程序设计基础篇_编程练习题**18.30 (找出单词)

题目&#xff1a;**18.30 (找出单词) 编写一个程序&#xff0c;递归地找出某个目录下的所有文件中某个单词出现的次数。从命令行如下传递参数&#xff1a; java Exercise18_30 dirName word 习题思路 &#xff08;读取路径方法&#xff09;和18.28题差不多&#xff0c;把找…

电子元件制造5G智能工厂物联数字孪生平台,推进制造业数字化转型

5G智能工厂与物联数字孪生平台的融合应用&#xff0c;不仅为电容器制造业注入了新的活力&#xff0c;更为整个制造业的数字化转型树立了新的标杆。电子元件制造过程中&#xff0c;数字孪生平台通过实时监测生产线的各个环节&#xff0c;实现了生产流程的可视化监控。管理人员可…

vue中的slot插槽,彻底搞懂及使用

1、使用slot站位&#xff0c;不传内容&#xff0c;显示默认值 //父组件 import SlotChild from ./projectConstruction-child/SlotChild.vue <div><SlotChild></SlotChild> </div>//子组件 <template><div>下面是插槽内容</div><…

【爆炸】BB机,BP机,寻呼系统基础知识,物理层讲解

本页介绍寻呼系统基础知识。其中提到了寻呼机使用的数字协议并描述了数字寻呼接收器。 寻呼是一种单向通信系统。寻呼系统向携带小型电池供电设备&#xff08;称为寻呼机&#xff09;的个人广播信号或消息。这是与员工和/或客户沟通的非常重要的方式。让我们看看寻呼系统的工作…

新发布的OpenAI o1生成式AI模型在强化学习方面迈出了重要的一步

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

Xv6驱动(四):CLINT

阅读材料 Xv6代码&#xff1a;memlayout.h、start.c、kernelvec.S教材5.4节 CLINT内存映射 实际上&#xff0c;CLINT还包括若干个MSIP寄存器&#xff0c;用来触发软件中断&#xff0c;但是在Xv6中不考虑软件中断&#xff0c;因此这些寄存器也不用考虑 // core local interr…

python 运行其他命令行工具,实时打印输出内容

起因&#xff0c; 目的: python 运行一个命令&#xff0c;最简洁的写法是: import os # 转换视频格式。 cmd "ffmpeg -i a1.ts -c copy a1.mp4"os.system(cmd)问题&#xff1a; 如果上面的视频比较大&#xff0c;需要运行很长时间&#xff0c;那么感觉就像是卡住…

C# 访问Access存取图片

图片存入ole字段&#xff0c;看有的代码是获取图片的字节数组转换为base64字符串&#xff0c;存入数据库&#xff1b;显示图片是把base64字符串转换为字节数组再显示&#xff1b;直接存字节数组可能还好一点&#xff1b; 插入的时候用带参数的sql写法比较好&#xff1b;用拼接…

InternVL 微调实践闯关任务

基础任务 follow 教学文档和视频使用QLoRA进行微调模型&#xff0c;复现微调效果&#xff0c;并能成功讲出梗图. 尝试使用LoRA&#xff0c;或调整xtuner的config&#xff0c;如LoRA rank&#xff0c;学习率。看模型Loss会如何变化&#xff0c;并记录调整后效果(选做&#xff…

十、数字人IP应用方案

1、背景 在当今的数字时代,随着AI技术的突飞猛进,数字人AI已经从概念走向应用,成为知识内容创作领域一股不可忽视的力量。它的出现,在很大程度上极大地提高了内容的生产效率,大有替代知识IP,成为内容IP终结者的趋势。 数字人IP,从形象到声音,与知识博主真人的相似度可…

初中生物--7.生物圈中的绿色植物(二)

绿色植物与生物圈的水循环 1.植物对水分的吸收和运输 1.植物主要通过根吸收水分。根吸收水分的主要部位是根尖的成熟区。 2.外界溶液浓度<根毛细胞溶液浓度→细胞吸水&#xff1b; 1.在这种情况下&#xff0c;根毛细胞内的溶液浓度高于外界溶液&#xff0c;因此细胞内的…

蓝星多面体foc旋钮键盘复刻问题详解

介绍&#xff1a; 本教程是针对立创开源项目 承载我所有幻想的键盘 - 立创开源硬件平台 作者是 蓝星多面体 这里我总结一下我复刻过程中的一些问题 一 <<编译环境怎么搭建&#xff1f;>> 第一步 安装vscode 下载vscode &#xff08;可以在各大应用平台…

R语言中的shiny框架

R语言中的shiny框架 Shiny 的基本概念基本用法示例常见用法示例1. 输入控件2. 输出控件3. 动态 UI4. 数据传递和反应式编程 高级功能1. 使用 shinyjs2. 使用 shinythemes Shiny 是一个 R 语言的框架&#xff0c;用于构建交互式的网页应用&#xff0c;可以让用户以最少的 HTML、…

飞驰云联FTP替代方案:安全高效文件传输的新选择

FTP协议广泛应用各行业的文件传输场景中&#xff0c;由于FTP应用获取门槛低、使用普遍&#xff0c;因此大部分企业都习惯使用FTP进行文件传输。然而面临激增的数据量和网络安全威胁的不断演变&#xff0c;FTP在传输安全性与传输性能上有所欠缺&#xff0c;无法满足企业现在的高…

2024java面试-软实力篇

为什么说简历很重要&#xff1f; 一份好的简历可以在整个申请面试以及面试过程中起到非常好的作用。 在不夸大自己能力的情 况 下&#xff0c;写出一份好的简历也是一项很棒的能力。为什么说简历很重要呢&#xff1f; 、 先从面试来说 假如你是网申&#xff0c;你的简历必然…

Windows本地pycharm使用远程服务器conda虚拟环境

1、Windows下载pycharm专业版&#xff0c;必须是专业版&#xff0c;不然连不了远程服务器。 Download PyCharm: The Python IDE for data science and web development by JetBrains 2、添加远程服务器的虚拟环境&#xff0c;在pycharm右下角落选择 添加新的解释器>>SSH。…

计算机网络33——文件系统

1、chmod 2、chown 需要有root权限 3、link 链接 4、unlink 创建临时文件&#xff0c;用于非正常退出 5、vi vi可以打开文件夹 ../是向外一个文件夹 6、ls ls 可以加很多路径&#xff0c;路径可以是文件夹&#xff0c;也可以是文件 ---------------------------------…

【Java】并发集合

并发集合&#xff08;java.util.concurrent&#xff09; 一、List CopyOnWriteArrayList&#xff08;ReentrantLock实现线程安全&#xff09; &#xff08;1&#xff09;并发修改&#xff08;写操作&#xff09;时保证线程安全&#xff1a; 通过ReentrantLock实现多个线程并…

Solidwork角度尺寸标注

效果如下&#xff1a; 首先&#xff0c; 先选第一条边 然后选第二条边&#xff0c;即可

把设计模式用起来!(4) 用不好模式?之原理不明

&#xff08;清华大学出版社 《把设计模式用起来》书稿试读&#xff09; 上一篇&#xff1a;把设计模式用起来&#xff01;&#xff08;3&#xff09;用不好模式&#xff1f;之时机不对 为什么用不好设计模式&#xff1f;——原理不明 难搞的顾客&#xff1a;“抹这种霜&#…