千家信息网

编程中如何实现堆的插入和删除操作

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,本篇内容主要讲解"编程中如何实现堆的插入和删除操作",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"编程中如何实现堆的插入和删除操作"吧!最大堆的插入//向最
千家信息网最后更新 2026年11月01日编程中如何实现堆的插入和删除操作

本篇内容主要讲解"编程中如何实现堆的插入和删除操作",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"编程中如何实现堆的插入和删除操作"吧!

最大堆的插入
//向最大堆中插入元素, heap:存放堆元素的数组    public static void insert(List heap, int value) {        //在数组的尾部添加        if(heap.size()==0)          heap.add(0);//数组下标为0的位置不放元素        heap.add(value);         //开始上升操作        // heapUp2(heap, heap.size() - 1);         heapUp(heap, heap.size() - 1);      }      //上升,让插入的数和父节点的数值比较,当大于父节点的时候就和父节点的值相交换     public static void heapUp(List heap, int index) {          //注意由于数值是从下标为1开始,当index = 1的时候,已经是根节点了         if (index > 1) {             //求出父亲的节点             int parent = index / 2;              //获取相应位置的数值             int parentValue = (Integer) heap.get(parent);             int indexValue = (Integer) heap.get(index);             //如果父亲节点比index的数值小,就交换二者的数值             if (parentValue < indexValue) {                 //交换数值                 swap(heap, parent, index);                 //递归调用                 heapUp(heap, parent);             }          }     }
最大堆的删除
    /**     * 删除堆中位置是index处的节点     * 操作原理是:当删除节点的数值时,原来的位置就会出现一个孔     * 填充这个孔的方法就是,把最后的叶子的值赋给该孔,最后把该叶子删除     * @param heap      */     public static void delete(List heap,int index) {         //把最后的一个叶子的数值赋值给index位置         heap.set(index, heap.get(heap.size() - 1));         //下沉操作         //heapDown2(heap, index);         heapDown(heap, index);         //把最后一个位置的数字删除         heap.remove(heap.size() - 1);     }     /**     * 递归实现     * 删除堆中一个数据的时候,根据堆的性质,应该把相应的位置下移,才能保持住堆性质不变     * @param heap 保持堆元素的数组     * @param index 被删除的那个节点的位置     */     public static void heapDown(List heap, int index) {         //因为第一个位置存储的是空值,不在考虑之内         int n = heap.size() - 2;          //记录最大的那个儿子节点的位置         int child = -1;          //2*index>n说明该节点没有左右儿子节点了,那么就返回         if (2 * index > n) {             return;         } //如果左右儿子都存在         else if (2 * index < n) {              //定义左儿子节点             child = 2 * index;             //如果左儿子小于右儿子的数值,取右儿子的下标             if ((Integer) heap.get(child) < (Integer) heap.get(child + 1)) {                 child++;             }          }//如果只有一个儿子(左儿子节点)         else if (2 * index == n) {             child = 2 * index;         }          if ((Integer) heap.get(child) > (Integer) heap.get(index)) {             //交换堆中的child,和index位置的值             swap(heap, child, index);              //完成交换后递归调用,继续下降             heapDown(heap, child);         }     }

到此,相信大家对"编程中如何实现堆的插入和删除操作"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

节点 位置 数值 儿子 元素 数组 编程 下标 叶子 大堆 时候 递归 内容 性质 方法 父亲 学习 实用 更深 最大 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网科技工作委员会副主任毛军 科技互联网政务服务 互联网扶贫科技 猪兼强互联网科技 致骋互联网科技 火传媒上海互联网科技 互联网金融监管科技 卫星互联网科技股票 央行互联网金融科技公司 金融科技与互联网金融相同和不同 河南猎农互联网科技有限公司 花神(南京)互联网科技有限公司 知域互联网科技有限公司大骗子 互联网科技人工智能实验室 领航科技大厦互联网公司 下一代互联网重大应用科技园 半导体行业属于互联网高科技类吗 广州梦谷互联网科技有限公司领导 陕西九四连强互联网科技有限公司 北京品多多互联网科技有限公司 互联网核心科技是什么 安徽鑫晟辉互联网科技 互联网公司会议桌创意科技软装饰 济南华为互联网科技产业总部基地 江阴互联网智能科技产品进口 链环科技传统企业怎么转型互联网 科技赋能视角下互联网保险发展 长沙互联网科技 互联网科技接地气 保山互联网科技靠谱吗
0