数据结构学习记录——堆的删除(思路图解、代码实现、逐段解析)

简介: 数据结构学习记录——堆的删除(思路图解、代码实现、逐段解析)

堆的删除(最大堆)

思路

代码

ElementType DeleteMax( MaxHeap H )
{ /* 从最大堆H中取出键值为最大的元素,并删除一个结点 */
    int Parent, Child;
    ElementType MaxItem, X;
 
    if ( IsEmpty(H) ) 
    {
        printf("最大堆已为空");
        return ERROR;
    }
 
    MaxItem = H->Data[1]; /* 取出根结点存放的最大值 */
 
    /* 用最大堆中最后一个元素从根结点开始向上过滤下层结点 */
    X = H->Data[H->Size--]; /* 注意当前堆的规模要减小 */
 
    for( Parent=1; Parent*2<=H->Size; Parent=Child ) 
    {
        Child = Parent * 2;
        if( (Child!=H->Size) && (H->Data[Child]<H->Data[Child+1]) )
        {
            Child++;  /* Child指向左右子结点的较大者 */
        }
            
        if( X >= H->Data[Child] ) 
        {
            break; /* 找到了合适位置 */
        }
        else  /* 下滤X */
        {
            H->Data[Parent] = H->Data[Child];
        }
            
    }
    H->Data[Parent] = X;
 
    return MaxItem;
} 

解析


判断最大堆是否为空,如果为空则返回错误。


取出根结点存放的最大值,即最大元素。 放在临时变量MaxItem中。


将堆的规模减一。

这里的变量parent,用于表示当前结点的父结点在最大堆中的下标位置。

在删除最大值的操作中,我们需要将最后一个元素放到根结点的位置,


然后从根结点开始向下过滤,找到合适的位置,使得最大堆的性质得以保持。


在向下过滤的过程中,我们需要比较当前结点和其左右子结点的大小关系,


如果当前结点比其子结点都大,那么就找到了合适的位置,可以结束操作。


否则,我们需要将当前结点和其子结点中较大的那个交换位置,然后继续向下过滤。

在这个过程中,parent变量的作用是表示当前结点的下标位置,方便我们进行比较和交换操作。

在最大堆中,每个结点的左子结点下标为2i,右子结点下标为2i+1,其中i为当前结点的下标。

当一个结点只有左子结点时,其右子结点下标为2i+1,超出了最大堆的范围,

因此需要判断 child != H->size,即该节点是否有右子节点,(child先指向的是左子结点,若child == H->size,就说明已经是堆中的最大值了,意味着没有右子结点了)


如果有,则需要比较左右子节点的大小,选择较大的子节点进行下滤操作。


如果没有右子节点,则直接将左子节点与X进行比较。


最后,将 X 插入到 Parent 的位置上即可。


函数结束,返回最大堆中键值最大的元素。

 


end



目录
相关文章
|
算法 数据可视化 开发者
为什么要学习数据结构与算法
今天,我向大家介绍一门非常重要的课程——《数据结构与算法》。这门课不仅是计算机学科的核心,更是每一位开发者从“小白”迈向“高手”的必经之路。
为什么要学习数据结构与算法
|
域名解析 存储 缓存
深入学习 DNS 域名解析
在平时工作中相信大家都离不开 DNS 解析,因为 DNS 解析是互联网访问的第一步,无论是使用笔记本浏览器访问网络还是打开手机APP的时候,访问网络资源的第一步必然要经过DNS解析流程。
1944 31
|
存储 机器学习/深度学习 算法
C 408—《数据结构》图、查找、排序专题考点(含解析)
408考研——《数据结构》图,查找和排序专题考点选择题汇总(含解析)。
1831 29
|
存储 机器学习/深度学习 人工智能
C 408—《数据结构》易错考点200题(含解析)
408考研——《数据结构》精选易错考点200题(含解析)。
2221 27
|
存储 算法 安全
2024重生之回溯数据结构与算法系列学习之串(12)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丟脸好嘛?】
数据结构与算法系列学习之串的定义和基本操作、串的储存结构、基本操作的实现、朴素模式匹配算法、KMP算法等代码举例及图解说明;【含常见的报错问题及其对应的解决方法】你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
2024重生之回溯数据结构与算法系列学习之串(12)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丟脸好嘛?】
|
存储 搜索推荐 算法
【数据结构】树型结构详解 + 堆的实现(c语言)(附源码)
本文介绍了树和二叉树的基本概念及结构,重点讲解了堆这一重要的数据结构。堆是一种特殊的完全二叉树,常用于实现优先队列和高效的排序算法(如堆排序)。文章详细描述了堆的性质、存储方式及其实现方法,包括插入、删除和取堆顶数据等操作的具体实现。通过这些内容,读者可以全面了解堆的原理和应用。
1039 16
|
算法 安全 搜索推荐
2024重生之回溯数据结构与算法系列学习(8)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构王道第2.3章之IKUN和I原达人之数据结构与算法系列学习x单双链表精题详解、数据结构、C++、排序算法、java、动态规划你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
存储 算法 安全
2024重生之回溯数据结构与算法系列学习之顺序表【无论是王道考研人还真爱粉都能包会的;不然别给我家鸽鸽丢脸好嘛?】
顺序表的定义和基本操作之插入;删除;按值查找;按位查找等具体详解步骤以及举例说明
|
算法 安全 搜索推荐
2024重生之回溯数据结构与算法系列学习之单双链表精题详解(9)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构王道第2.3章之IKUN和I原达人之数据结构与算法系列学习x单双链表精题详解、数据结构、C++、排序算法、java、动态规划你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!

热门文章

最新文章

推荐镜像

更多
  • DNS