【数据结构】堆(Heap)详解----定义堆、初始化,删除、插入、销毁、判空、取堆顶


提示:以下是本篇文章正文内容

一、堆的概念及其性质:

堆的概念:

:是一种特殊的完全二叉树,使用数组进行存储,其所有的父结点大于等于或者小于等于它们的子结点,所以堆分为大根堆和小根堆。
大根堆(最大堆)::所有的父结点大于等于它们的子结点,堆顶是最大值。
小根堆(最小堆)::所有的父结点小于等于它们的子结点,堆顶是最小值。
举例
在这里插入图片描述
在这里插入图片描述

堆的性质:

对于具有n个结点的完全二叉树,若按照从上至下,丛左至右的数组顺序对所有结点从0开始编号,则对于序号为i的节点:
1.若i=0,i为根节点编号,无双亲结点。
2.若i>0,i位置结点的双亲序号:(i-1)/2;
3.若2i+1<n,左孩子序号:2i+1。
4.若21+2<n,右孩子序号:2i+2。

二、堆的定义及其基础操作的代码实现(C语言版)

因为堆的定义以及销毁、初始化很简单,就不赘述啦,直接看代码。难点主要在于堆的插入和删除,我们会用到两种方法向上调整法向下调整法,我会详细讲述。

1.定义堆

typedef int HPDataType;
typedef struct Heap
{
   
	HPDataType* _arr;
	int _size;//有效数据个数
	int _capacity;//空间大小
}Heap;

2.堆的初始化

void HeapInit(Heap* hp)
{
   
	assert(hp);
	hp->_arr = NULL;
	hp->_capacity = hp->_size = 0;
}

3.堆的销毁

void HeapDestory(Heap* hp)
{
   
	assert(hp);
	if(hp->_arr) free(hp->_arr);
	hp->_arr = NULL;
	hp->_capacity = hp->_size = 0
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值