二叉树建堆全过程(数组实现)

定义

typedef int HPDataType;typedef struct Heap {HPDataType* a;//用数组存数据int size;//当前数组存放数据的数量int capacity;//数组容量}HP;

即将要实现的功能

void HPInit(HP* php);//初始化
void HPPush(HP* php, HPDataType x);//堆尾插入数据(数组尾部插入)
void HPPop(HP* php);//删除根结点
void HPDestroy(HP* php);//销毁堆
HPDataType HPTop(HP* php);//获取根结点
bool HPEmpty(HP* php);//判断堆是否为空void Swap(HPDataType* p1, HPDataType* p2);//交换*p1和*p2的值
void AdjustUp(HPDataType* a, int child);//向上调整建堆
void AdjustDown(HPDataType* a, int n, int parent);//向下调整建堆

交换函数(为后续做准备)

void Swap(HPDataType* p1, HPDataType* p2)
{HPDataType temp = *p1;*p1 = *p2;*p2 = temp;
}

向上调整(建小堆)

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 = (child - 1) / 2;//小心parent<0,在while循环中用child>0这个条件比较保险【(0-1)/2=0】}else {break;}}
}

具体是如何操作的呢,给大家画个图理解一下

经过AdjustUp之后变成

向下调整

void AdjustDown(HPDataType* a, int n, int parent)//最小的元素在堆顶
{int child = 2 * parent + 1;//左孩子while (child<n){if (a[child] > a[child + 1] && child+1 < n) {//防止右孩子越界++child;//找到最小的左or右孩子,待会要与父节点交换}if (a[child] < a[parent]) {Swap(&a[child], &a[parent]);parent = child;child = 2 * parent + 1;}else {break;}}

咱们继续举例来理解一下

在上图这棵树中,我们要建小堆,但是我们可以发现,5结点小于6节点,所以5、6节点的位置要互换。

经过AdjustDown之后,变成

初始化

void HPInit(HP* php)
{assert(php);//断言,若php为空就会报错php->a = NULL;//数组置空//统统置0php->capacity = 0;php->size = 0;
}

堆的插入

void HPPush(HP* php, HPDataType x) {assert(php);
//判断数组是不是放满了,满了就扩容if (php->capacity == php->size) {
//运用三目运算符int newcapacity = php->capacity == 0 ? 4 : php->capacity * 2;HPDataType* temp = (HPDataType*)realloc(php->a, sizeof(HPDataType) * newcapacity);
//判断扩容是否成功if (temp == NULL) {perror("realloc fail!");return;}
//程序往下运行就扩容成功啦php->a = temp;php->capacity = newcapacity;}
//实现插入(在数组末尾插入)php->a[php->size] = x;
//szie++是为了下次插入数据php->size++;
//将新插入的数据调整到二叉树的正确位置中AdjustUp(php->a, php->size - 1);
}

堆的删除

删除从堆顶开始

​
void HPPop(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);//复位,把合适的堆顶元素放上来}​

获取堆顶元素

HPDataType HPTop(HP* php) {assert(php);assert(php->size > 0);return php->a[0];
}

判断堆是否为空

bool HPEmpty(HP* php)
{assert(php);return php->size == 0;
}

堆的销毁

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

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

论文阅读:Efficient Core Maintenance in Large Bipartite Graphs | SIGMOD 2024

还记得我们昨天讨论的《Querying Historical Cohesive Subgraphs over Temporal Bipartite Graphs》这篇论文吗? https://blog.csdn.net/m0_62361730/article/details/141003301 这篇(还没看的快去看) 这篇论文主要研究如何在时间双向图上查询历史凝聚子图&#xff0c;而《E…

深度学习入门指南(1) - 从chatgpt入手

2012年&#xff0c;加拿大多伦多大学的Hinton教授带领他的两个学生Alex和Ilya一起用AlexNet撞开了深度学习的大门&#xff0c;从此人类走入了深度学习时代。 2015年&#xff0c;这个第二作者80后Ilya Sutskever参与创建了openai公司。现在Ilya是openai的首席科学家&#xff0c;…

手机误操作导致永久删除照片的恢复方法有哪些?

随着手机功能的不断增强和应用程序的不断丰富&#xff0c;人们越来越依赖手机&#xff0c;离不开手机。但有时因为我们自己的失误操作&#xff0c;导致我们手机上重要的照片素材被永久删除&#xff0c;这时我们需要怎么做&#xff0c;才能找回我们被永久删除的照片素材呢&#…

Langchain框架深度剖析:解锁大模型-RAG技术的无限潜能,引领AI应用新纪元

文章目录 前言一、Langchain 框架概述二、大模型-RAG技术原理三、应用示例1.RAG案例一&#xff08;私有文档直接读取-问答&#xff09;2.RAG案例二&#xff08;Vue上传文件结合文件内容回答问题&#xff09;3.RAG案例三&#xff08;Vue秒传文件结合文件内容回答问题&#xff09…

无字母数字webshell命令执行

<?php if(isset($_GET[code])){$code $_GET[code];if(strlen($code)>35){die("Long.");}if(preg_match("/[A-Za-z0-9_$]/",$code)){die("NO.");}eval($code); }else{highlight_file(__FILE__); }限制&#xff1a; 1.webshell长度不超过…

【海思SS626 | 内存管理】海思芯片的OS内存、MMZ内存设置

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&a…

基于jsp的宠物领养与服务管理系统(源码+论文+部署讲解等)

博主介绍&#xff1a;✌全网粉丝10W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌ 技术栈介绍&#xff1a;我是程序员阿龙&#xff…

【SpringBoot】自定义注解<约定式i18n国际化>终极升级版方案源码Copy

零、前言 在后端对于 SpringBoot 的 数据库数据&#xff0c;需要国际化的字段和主要显示字段是分离的&#xff0c;为了避免大耦合性&#xff0c;与用户端的国际化字段处理问题&#xff0c;统一采用主要显示数据的实体字段。为此&#xff0c;我设计了一套解决方案&#xff0c;通…

el-form-item,label在上方显示,输入框在下方展示

本来是两排展示去写&#xff0c;设计要求一排展示&#xff0c;label再上方&#xff0c;输入框、勾选框在下方&#xff1b;只能调整样式去修改&#xff1b;参考label-position这个属性 代码如下&#xff1a; <el-form ref"form" :model"formData" clas…

React应用(基于react脚手架)

react脚手架 1.xxx脚手架&#xff1a;用来帮助程序员快速创建一个基于xxx库的模板项目 包含了所有需要的配置&#xff08;语法检查&#xff0c;jsx编译&#xff0c;devServer&#xff09;下载好了所有相关的依赖可以直接运行一个简单结果 2.react提供了一个用于创建react项目…

AWVS——Web 应用漏洞扫描的强大工具

一、引言 在网络安全日益重要的今天&#xff0c;Web 应用的安全性备受关注。Acunetix Web Vulnerability Scanner&#xff08;简称 AWVS&#xff09;作为一款知名的 Web 应用漏洞扫描工具&#xff0c;为保障 Web 应用的安全发挥了重要作用。本文将详细介绍 AWVS 的功能、特点、…

【vulhub靶场之spring】——

简介&#xff1a; Spring是Java EE编程领域的一个轻量级开源框架&#xff0c;该框架由一个叫Rod Johnson的程序员在2002年最早提出并随后创建&#xff0c;是为了解决企业级编程开发中的复杂性&#xff0c;业务逻辑层和其他各层的松耦合问题&#xff0c;因此它将面向接口的编程思…

【Postman工具】

一.接口扫盲 1.什么是接口&#xff1f; 接口是系统之间数据交互的通道。拿小红到沙县点餐为例&#xff1a;小红想吃鸭腿饭。她要用什么语言来表达&#xff1f;跟谁表达&#xff1f;通过什么表达&#xff1f;按照生活习惯应该是&#xff1a;小红根据菜单对服务员用中文表达她想要…

联通数科如何基于Apache DolphinScheduler构建DataOps一体化能力平台

各位小伙伴晚上好&#xff0c;我是联通数字科技有限公司数据智能事业部的王兴杰。 更好的阅读体验可前往原文阅读:巨人肩膀 | 联通数科如何基于Apache DolphinScheduler构建DataOps一体化能力平台 今天&#xff0c;我将和大家聊一聊联通数字科技有限公司是如何基于Apache Dol…

k8s创建secret并在container中获取secret

k8s创建secret并在container中获取secret 本文使用的deployment和service与我的上一篇文章一样。link也放在下面了&#xff0c;如果不懂什么事deployment和service&#xff0c;可以先看我的上一篇文章。 k8s使用kustomize来部署应用 下面我们将通过创建secret开始。secret是我…

保姆教程篇:手把手教你从零开始本地部署Dify

本教程将指导您在个人电脑上安装和配置 Dify。 为什么需要Dify 在开始具体的教程之前&#xff0c;先搞清楚为什么要选择 Dify。 6 月份&#xff0c;阿里巴巴全球数学竞赛中&#xff0c;首次接受AI参赛。结果令人大跌眼镜&#xff1a;AI选手们的表现完全无法与人类选手相提并…

萌啦数据软件价格多少,萌啦数据软件价格是多少

在当今这个数据驱动的时代&#xff0c;无论是企业运营、市场分析还是个人研究&#xff0c;都离不开高效、准确的数据处理与分析工具。萌啦数据软件&#xff0c;作为业界一颗璀璨的新星&#xff0c;凭借其强大的功能、友好的用户界面以及灵活的数据处理能力&#xff0c;赢得了众…

[SWPUCTF 2021 新生赛]PseudoProtocols(构造伪协议)

打开题目所给的环境我们可以看到这样一句话&#xff1a; 这里我先尝试访问/hint.php &#xff0c;但是发现什么都没有发生&#xff0c; F12查看源代码也并没有发现什么&#xff0c;到这里来看的话似乎没有思路了&#xff0c;但是这个题的题目已经给了我们很明显的提示&#xff…

类和对象(中)(1)

类和对象&#xff08;中&#xff09;(1) 类的默认成员函数 默认成员函数就是用户没有显式实现&#xff0c;编译器会⾃动⽣成的成员函数称为默认成员函数。 ⼀个类&#xff0c;我们不写的情况下编译器会默认⽣成以下6个默认成员函数&#xff0c;需要注意的是这6个中最重要的是…

云计算实训24——python基本环境搭建、变量和数据类型、数据集合、py脚本

一、python环境搭建 确保拥有阿里云镜像 查看python环境 [rootpython ~]# yum list installed | grep python 查看epel是否安装 [rootpython ~]# yum list installed | grep epel 安装epel [rootpython ~]# yum -y install epel-release.noarch 查看是否安装python3 [rootpyt…