文章目录
前言
本篇文章将带大家了解另一个数据结构的重要算法:堆的建立和基本操作实现。
一、堆调整-向下调整法
堆调整的思想:当给出一个完全二叉树时,且二叉树的左右子树都满足堆的特性且同为大堆或小堆,只有根节点不满足时。只需进行一次向下调整就可以把完全二叉树变成堆。
例:如下图所示除根结点外,左右子树均为小堆。此时只需要进行一次向下调整,就可以把原二叉树变成小堆。
1.1向下调整的步骤
1.将根结点标记为父结点parent,将父结点的左孩子标记为child。
2.如果父节点有右孩子,将左右孩子的数值进行比较。取较小的标记为child,并将parent和child结点交换
3.将原来的child结点标记为parent,再将现在parent的左孩子标记为child,循环进行上面的操作,直到parent在叶子结点处位置。
二,建堆
现在如果想建一个堆,但是已经给出的完全二叉树的左右子树不满足堆的性质。所以此时,只运用一次向下调整法已经解决不了问题了。
此时解决问题的思路是:如果想想把树变成堆,就要先让树的子树变成堆;要让树的子树变成堆,就要让子树的子树先变成堆。按照这种思想,一层一层的从底层向上调整就能够解决问题。
2.1建堆步骤
-
先找到最后一个堆,再依次从后往前调整。以最后一个非叶子结点(即最后一个结点的双亲结点)为根节点的堆就是最后一个堆。
-
从后往前依次用向下调整法调整
三,建堆以及,堆的增删查改操作的代码实现
1.首先定义堆的结构体
在这里我们用一个数组来存放堆。
capacity是数组的容量,size是数组中存放的堆的元素个数
typedef int DataType;
typedef struct Heap
{
DataType* array;
DataType capacity;
DataType size;
}Heap;
2.实现堆的初始化
void HeapInit(Heap* hp, DataType* array, DataType size)
{
int LastNotLeaf = 0;
assert(hp);
hp->array = (DataType*)malloc(sizeof(DataType) * size);
if (N