二叉堆

本文深入讲解了二叉堆的概念,包括最大堆和最小堆,并详细介绍了插入和删除操作的实现过程。通过具体代码示例,读者可以更好地理解二叉堆的运作原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

二叉堆

二叉堆是二叉树的一中,可以理解为完全二叉树,而二叉堆分两种,一种是最大堆(即父节点大于或等于子节点),另一种是最小堆(即父节点小于等于子节点)。

它的常用操作有插入,查询和删除。

以最小堆为例,先把需要插入的元素放在底部,再通过交换子树(也是堆)的根节点和叶结点来移动这个插入的新元素,直到符合条件(即父节点小于等于子节点)。

插入

代码如下:

int heap[1000],i=0;
void push(int n)
{
    heap[++i]=n;//插入到堆底
    now=i;
    while(now)
    {
        int next=now/2;//找它的父亲
        if(heap[next]>heap[now])
        {
            int t=heap[next];
                  heap[next]=heap[now];
                            heap[now]=t;
        }//父亲比它大,那就交换
        else
            break;//父亲比它小,那就代表着插入完成了
        now=nxt;//继续下一轮的比较
    }
    return;
}

删除。

删除比较麻烦,因为我们要保证操作完成后仍然符合二叉堆的性质,因此我们要先将元素沉到树底,再进行操作。

void pop(int n)
{
    int t=heap[n];
    heap[n]=heap[i];
    heap[i]=t;
    i--;
    while((now*2)<=siz) //对该节点进行向下交换的操作
    {
        int next=n*2;//找出当前节点的左儿子
        if(next+1<=i&&heap[next+1]<heap[next])
            next++;//比较左儿子和右儿子哪个更小
        if(heap[next]<heap[n])
        {
            t=heap[next];
            heap[next]=heap[n];
            heap[n]=t;
        }
        else
            break;
        n=next;//往下一层继续向下交换
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值