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

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.xdnf.cn/news/144371.html

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

相关文章

MICROLAB电源维修MXP7U 400-60 高压电源维修

法国MICROLAB POWER SUPPLY全系列型号电源维修MXP 1500-10。 专注维修进口设备电源&#xff0c;主要有高压电源&#xff08;High Power Supply&#xff09;、框架式可控大功率直流电源&#xff08;DC Power Supply&#xff09;、射频电源(RF Generator)、微波发生器(Microwave…

制作京东首页右侧固定层

html部分 <!DOCTYPE html> <html> <head lang"en"><meta charset"UTF-8"><title>京东首页右侧固定层</title><link href"css/nav.css" rel"stylesheet"> </head> <body> <…

猎板PCB:精密多层板压合定制工艺,打造高性能电路板解决方案

在多层板PCB的制造过程中&#xff0c;压合定制工艺是确保电路板性能和可靠性的关键环节。以下是对猎板PCB多层板压合定制工艺的详细介绍和优化&#xff1a; 选材与预处理&#xff1a; 精选高品质基材&#xff0c;如FR-4&#xff0c;确保机械和电气性能。对铜箔进行彻底清洁、微…

解决猫咪缺水难题!主食罐应该多久喂一次?补水主食罐推荐

我们家猫咪以猫粮为主食&#xff0c;但每周至少要喂2——3个主食猫罐头。这是因为猫粮的水含量低&#xff0c;加上猫咪习惯从猎物中获取所水分&#xff0c;很少主动喝水&#xff0c;只喂猫粮的话&#xff0c;猫咪容易因为补水不足而患上泌尿系统疾病、肾脏等问题。而主食罐头的…

【经典文献】双边曲面去噪

文章目录 2003 TOG基本思想效果 2003 TOG 2003年&#xff0c;Fleishman等人在TOG上&#xff0c;基于图像双边滤波的思想&#xff0c;将其改造成了可以用在曲面上的双边滤波算法。 Fleishman S, Drori I, Cohen-Or D. Bilateral mesh denoising[M]//ACM SIGGRAPH 2003 Papers.…

YOLOv9改进策略【卷积层】| AKConv: 具有任意采样形状和任意参数数量的卷积核

一、本文介绍 本文记录的是利用AKConv优化YOLOv9的目标检测网络模型。标准卷积操作的卷积运算局限于局部窗口&#xff0c;无法捕获其他位置的信息&#xff0c;且采样形状固定&#xff0c;无法适应不同数据集和位置中目标形状的变化。而AKConv旨在为卷积核提供任意数量的参数和…

LeetCode[中等] 438. 找到字符串中所有字母异位词

给定两个字符串 s 和 p&#xff0c;找到 s 中所有 p 的 异位词 的子串&#xff0c;返回这些子串的起始索引。不考虑答案输出的顺序。 异位词 指由相同字母重排列形成的字符串&#xff08;包括相同的字符串&#xff09;。 思路&#xff1a;滑动窗口 s包含p的异位词 ——> 则…

静态住宅代理 vs 住宅代理:稳定IP有哪些优势?

在代理服务器中&#xff0c;我们通常以IP地址是否经常轮换为标准&#xff0c;将代理分为静态和住宅代理。这两种代理方式各有千秋&#xff0c;在不同的应用场景中发挥着不同的作用。但是由于场景繁多&#xff0c;用处也大有不同&#xff0c;导致很多人对于这两种代理方式并不是…

基于微信小程序的游泳馆管理系统--论文源码调试讲解

2 关键技术介绍 2.1 SSM框架 开发信息管理系统的主流框架是SSM&#xff08;Spring Spring MVC MyBatis&#xff09;&#xff0c;SSM框架web层使用Spring MVC框架&#xff0c;使传输前后端数据变得简单&#xff1b;对于业务层使用Spring作为轻量级控制反转和面向切面的容器框…

C++速通LeetCode中等第5题-无重复字符的最长字串

字串substr法&#xff0c;定义字串的头部和长度&#xff0c;和字串后一位对比&#xff0c;如果不存在重复元素则长度1&#xff0c;存在重复元素则头部更新&#xff0c;长度重置。 class Solution { public:int lengthOfLongestSubstring(string s) {string s2;//存放s的前一部分…

springboot实训学习笔记(4)(Spring Validation参数校验框架、全局异常处理器)

接着上篇博客学习。上篇博客是已经基本完成用户模块的注册接口的开发。springboot实战学习笔记&#xff08;3&#xff09;(Lombok插件、postman测试工具、MD5加密算法、post请求、接口文档、注解、如何在IDEA中设置层级显示包结构、显示接口中的方法)-CSDN博客本篇博客主要是关…

【free -h内存占用】

在 free -g 命令的输出中&#xff0c;最能准确反映系统中剩余可用内存的参数是 available。这个参数考虑了缓存和缓冲的内存&#xff0c;可以更准确地反映系统的可用内存。 让我们再看一下假设的输出&#xff1a; total used free shared buff/cache av…

【PGCCC】使用 Postgres 进行数据分析的窗口函数

SQL 在处理单行数据时&#xff0c;甚至在聚合多行数据时都很有意义。但是&#xff0c;当您想比较已计算的行之间的数据时会发生什么&#xff1f;或者创建数据组并进行查询&#xff1f;输入窗口函数。 窗口函数往往会让人感到困惑 - 但它们是 SQL 中用于数据分析的非常棒的工具…

实验2 Linux文件系统常用操作实践

实验2 Linux文件系统常用操作实践 一、实验介绍 本节实验通过实战Linux文件操作模块的基本操作,需要先掌握linux文件系统的原理以及理解linux文件操作的原理,最后通过实操完成linux文件操作的命令,其中包括改变目录、创建目录及文件、删除文件、复制文件、文件移动和改名、查…

【大模型入门】零基础入门AI大模型应用开发,你需要一个系统的入门路径!

随着大模型技术的飞速发展&#xff0c;我们正站在一个全新的技术前沿&#xff0c;探索着如何将这些强大的工具应用于实际问题的解决。如果你对AI大模型应用开发充满热情&#xff0c;那么你可以读一下这篇文章——一个系统全面的入门指南&#xff0c;专为渴望深入AI世界的你设计…

Windows 系统管理

1 安装 Windows Server 2016 操作系统的硬件最低需求&#xff1f; 处理器 1.4GHz 64 位处理器 RAM 512MB&#xff08;带桌面体验 2GB&#xff09; 磁盘空间 32GB 2 Windows Server 2016 操作系统的常见版本&#xff1f; Windows Server 2016 Standard&#xff08; 标 准 版 &a…

【新手必看】SpringBoot集成Minio实现文件上传、下载和删除

一&#xff0c;前言 安装教程可看我以前的文章&#xff0c;Linux和Windows安装教程都有。安装好minio后今天学习minio的使用。 二&#xff0c;集成Minio 1&#xff0c;导入依赖&#xff0c;版本可自己选择 <!-- https://mvnrepository.com/artifact/io.minio/minio -->…

LeetCode力扣——并查集:947. 移除最多的同行或同列石头,1971. 寻找图中是否存在路径,2424. 最长上传前缀

947. 移除最多的同行或同列石头 题目描述 947. 移除最多的同行或同列石头 n 块石头放置在二维平面中的一些整数坐标点上。每个坐标点上最多只能有一块石头。 如果一块石头的 同行或者同列 上有其他石头存在&#xff0c;那么就可以移除这块石头。 给你一个长度为 n 的数组 …

[Golang] Select

[Golang] Select 文章目录 [Golang] Select什么是selectselect用法基本用法空select没有default且case永久无法执行单个case和default多个case和default IO多路复用 什么是select select是Golang中一个控制结构&#xff0c;可以用来处理多个channel的发送和接收操作。select会…

Echats 实现CPK (过程能力)研究报告

背景: 实现: Echarts Option 代码示例 option {title: {text: 折线图示例 - X轴为数值},xAxis: {type: value, // X 轴改为数值型min: 0, // 最小值max: 10, // 最大值},yAxis: {type: value},series: [{type: line,data: [[0, 150], [2, 230], [4, 224], [6…