【数据结构】大小堆的理解,创建,增加和删除元素操作

什么是大小堆?

大小堆是基于完全二叉树的结构;
大堆:任意一个结点的左右孩子的数据都小于此结点的数据,位于堆顶的结点的数据最大。
小堆:任意一个结点的左右孩子的数据都大于此结点的数据,位于堆顶的结点的数据最小。
下面以小堆为例,图解:

在这里插入图片描述

以下都是以小堆为例

如何创建小堆?

首先我们只会得到一个数组,并且我们知道堆最终形态是完全二叉树。通过递归的思想,如果能把最后一个以非叶子结点为根的树变为小堆,然后改变倒数第二个以非叶子结点为根的树,以此类推就可以将整个树变为小堆。函数内需要用到向下调整法可看注释:

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-></
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值