文章目录
一、堆的概念及其性质:
堆的概念:
堆的性质:
二、堆的定义及其基础操作的代码实现(C语言版)
1.定义堆
2.堆的初始化
3.堆的销毁
4.堆的插入
5.堆的删除
6.取堆顶的数据
7.堆的数据个数
8.堆的判空
总结:
提示:以下是本篇文章正文内容
一、堆的概念及其性质:
堆的概念:
堆:是一种特殊的完全二叉树,使用数组进行存储,其所有的父结点大于等于或者小于等于它们的子结点,所以堆分为大根堆和小根堆。 大根堆(最大堆)::所有的父结点大于等于它们的子结点,堆顶是最大值。 小根堆(最小堆)::所有的父结点小于等于它们的子结点,堆顶是最小值。 举例:
堆的性质:
对于具有n个结点的完全二叉树,若按照从上至下,丛左至右的数组顺序对所有结点从0开始编号,则对于序号为i的节点: 1.若i=0,i为根节点编号,无双亲结点。 2.若i>0,i位置结点的双亲序号:(i-1)/2; 3.若2i+1 二、堆的定义及其基础操作的代码实现(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; }