二叉堆

二叉堆

二叉堆是一种特殊的堆,二叉堆有两种最大堆和最小堆。
最大堆:父节点的键值总是大于或等于任何一个子节点的键值;

最小堆:父节点的键值总是小于等于任何一个子节点的键值;

这个键值不一定是传统数值,一般指优先级;
基本操作:插入节点,删除节点,构建二叉堆,取出值最小的节点,减小节点的值等;

插入节点

二叉堆的节点插入,插入的位置是最后一个位置;


节点0与父节点5比较,0<5,0节点就与父节点交换位置;

重复上述操作,直到不能交换;

代码实现
void push(int x)//插入堆的值 
{
 int now = size++;//插入节点的编号 
 while(now > 0)
 {
  int f = (now - 1)/2;//父亲节点的编号
  if(heap[f] <= x)
  break;//如果顺序未颠倒,则退出循环
  heap[now] = heap[f];
  now = f; 
 }
 heap[now] = x;
}

删除节点

删除与插入有点不一样,一般删除堆顶节点;

然后把堆顶与最后一个节点交换,并把交换后的最后一个节点删除;
在这里插入图片描述
然后找其左右孩子中较小的,如果大于较小的,则进行交换,直到不能交换;

代码实现
int pop()
{
 int res = heap[0];
 int x = heap[--size];//最末尾的节点 
 int i = 0;//从根节点开始操作 
 while(i * 2 + 1 < size)
 {
  int lchild = 2 * i + 1;
  int rchild = 2 * i + 2;
  if(rchild < size&& heap[rchild] < heap[lchild])lchild = rchild;
  if(heap[lchild] >= x) break;//如果x已经在lchild上层了,就可以停止了 
  heap[i] = heap[lchild];
  i = lchild; 
 }
 heap[i] = x;
 return res;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值