基本数据结构之最大堆最小堆

本文介绍了最大堆和最小堆的概念,其中最大堆的根节点值为所有节点中最大,而最小堆的根节点值为最小。还详细讨论了插入操作,描述了在二叉堆中插入新节点后如何维护堆性质的过程,其时间复杂度为O(log(N))。并提供了简单的C语言实现示例。

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

一、最大堆和最小堆

    最大堆和最小堆二叉堆的两种形式。

          1)最大堆:根节点的值是所有结点中最大的一个

          2)最小堆:根节点的值是所有结点中做小的一个

二、基本操作

          插入操作:只要将结点插在二叉树最后一个结点位置,然后比较它和父节点的大小,如果大则停止,否则交换位置,然后对父节点递归该过程至根节点。复杂度为O(log(N))

         简单的C语言实现:

        

typedef struct heap {
     int arr[127];
     int size;
}HEAP;

void insert(HEAP *h,int n){
       if(!h)  return;
       int sz = h->size++;
       printf("%d --- %d\n",sz,n);
       while(sz>0){
            if(n < h->arr[(sz-1)/2]){
                h->arr[sz] = h->arr[(sz-1)/2];
                sz = (sz-1)/2;
            }else{
                h->arr[sz] = n;
                return;
            }
       }
       h->arr[0] = n;
}

       删除操作:要从堆中删除一个结点,用最后一个结点替换掉根结点,然后调整结点顺序以维持堆的特性。

  

void delete(HEAP *h){
       h->size--;
       h->arr[0] = h->arr[h->size];
       h->arr[h->size] = 0;
       int i = 1,cv = h->arr[0],tmp;
       while(h->arr[i]>0){
               if(h->arr[i] < cv){
                      h->arr[(i-1)/2] = h->arr[i];
                      h->arr[i] = cv;
                      i = i*2 + 1;
               }else if(h->arr[i+1] < cv){
                      h->arr[(i-1)/2] = h->arr[i+1];
                      h->arr[i+1] = cv;
                      i = 2*(i+1)+1;
               }else{
                      return;
               }
       }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值