什么是大小堆?
大小堆是基于完全二叉树的结构;
大堆:任意一个结点的左右孩子的数据都小于此结点的数据,位于堆顶的结点的数据最大。
小堆:任意一个结点的左右孩子的数据都大于此结点的数据,位于堆顶的结点的数据最小。
下面以小堆为例,图解:
以下都是以小堆为例
如何创建小堆?
首先我们只会得到一个数组,并且我们知道堆最终形态是完全二叉树。通过递归的思想,如果能把最后一个以非叶子结点为根的树变为小堆,然后改变倒数第二个以非叶子结点为根的树,以此类推就可以将整个树变为小堆。函数内需要用到向下调整法可看注释:
void AdjustDown(pHeapStack pHs,int root) //向下调整法,以phs为根节点的整棵树变为大小堆
{
int parent = root;
int child = (root<<1)+1;
assert(pHs);
while(child<pHs->sz)
{
if(child+1<pHs->sz && pHs->_compare(pHs->data[child+1],pHs->data[child]))
child = child+1; //谁跟顶层的换值,下一步就调整谁,因为换了的就有可能不符合小堆
if(pHs->_compare(pHs->data[child],pHs->data[parent]))
Swap(&pHs-></