文章目录
提示:以下是本篇文章正文内容
一、堆的概念及其性质:
堆的概念:
堆:是一种特殊的完全二叉树,使用数组进行存储,其所有的父结点大于等于或者小于等于它们的子结点,所以堆分为大根堆和小根堆。
大根堆(最大堆)::所有的父结点大于等于它们的子结点,堆顶是最大值。
小根堆(最小堆)::所有的父结点小于等于它们的子结点,堆顶是最小值。
举例:
堆的性质:
对于具有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