【数据结构】堆的删除

题目

实现在最小堆中删除给定序号为pos的元素,并由x返回,删除成功返回true,失败返回false。(注意:删除后要保持数据结构是最小堆。)

算法实现

在最小堆中删除给定序号为pos的元素,我们可以先删除该元素后将堆中最后一个元素补到该位子,然后向下调整为堆,在从该位置向上调整为堆。
1 如果堆空返回false
2 x = heap[pos]; // 返回元素
3 heap[pos] = heap[currentSize - 1]; //最后元素填补到pos结点
4 currentSize--;
5 siftDown(pos, currentSize - 1);//自上向下调整为堆
6 siftUp(pos); //向上调整为堆
时间复杂度为O(logn)

代码

template <class E>bool MinHeap <E>::Remove(int &pos,E &x)
{
    if (!currentSize) { //堆空, 返回false
        cout << "Heap empty" << endl;
        return false;
    }
    x = heap[pos];      // 返回该元素
    heap[pos] = heap[currentSize - 1];  //最后元素填补到pos结点
    currentSize--;
    siftDown(pos, currentSize - 1);//自上向下调整为堆
    siftUp(pos);
    return true;
}

原文地址:https://www.cnblogs.com/muyefeiwu/p/11838600.html

时间: 2024-11-10 13:57:33

【数据结构】堆的删除的相关文章

数据结构-堆

堆(英语:Heap),是一种拥有像树那样的特殊数据结构,或者理解为具有优先级的树.它的特点是父节点的值大于(或小于)两个子节点的值(分别称为大顶堆和小顶堆).它常用于管理算法执行过程中的信息,应用场景包括堆排序,优先队列等.堆通常是一个可以被看做一棵树的数组(或ArrayList)对象.常见的堆有二叉堆.二项堆.斐波那契堆等. 二叉堆(Binary heap) 二叉堆是一种特殊的堆,实为二叉树的一种:是完全二叉树或者是近似完全二叉树.二叉堆满足堆特性:父节点的键值总是保持固定的序关系于任何一个子

数据结构--堆的实现之深入分析

一,介绍 以前在学习堆时,写了两篇文章:数据结构--堆的实现(上)   和   数据结构--堆的实现(下),  感觉对堆的认识还是不够.本文主要分析数据结构 堆(讨论小顶堆)的基本操作的一些细节,比如 insert(插入)操作 和 deleteMin(删除堆顶元素)操作的实现细节.分析建堆的时间复杂度.堆的优缺点及二叉堆的不足. 二,堆的实现分析 堆的物理存储结构是一维数组,逻辑存储结构是完全二叉树.堆的基本操作有:insert--向堆中插入一个元素:deleteMin--删除堆顶元素 故堆的类

【C/C++学院】0828-STL入门与简介/STL容器概念/容器迭代器仿函数算法STL概念例子/栈队列双端队列优先队列/数据结构堆的概念/红黑树容器

STL入门与简介 #include<iostream> #include <vector>//容器 #include<array>//数组 #include <algorithm>//算法 using namespace std; //实现一个类模板,专门实现打印的功能 template<class T> //类模板实现了方法 class myvectorprint { public: void operator ()(const T &

数据结构--堆的实现(下)

1,堆作为优先级队列的应用 对于普通队列而言,具有的性质为FIFO,只要实现在队头删除元素,在队尾插入元素即可.因此,这种队列的优先级可视为按 时间到达 的顺序来衡量优先级的.到达得越早,优先级越高,就优先出队列被调度. 更一般地,很多应用不能单纯地按时间的先后来分优先级,比如按CPU占用时间或者其它方式……在这种情形下,使用堆更容易表达优先级队列. 2,堆的两个性质:①结构性质--堆从结构上看是一颗完全二叉树.然而,从物理存储上看,堆的实现基本上是使用一个一维数组存储堆中所有的结点.②orde

数据结构——堆(Heap)大根堆、小根堆

Heap是一种数据结构具有以下的特点: 1)完全二叉树: 2)heap中存储的值是偏序: Min-heap: 父节点的值小于或等于子节点的值: Max-heap: 父节点的值大于或等于子节点的值: 堆的存储: 一般都用数组来表示堆,i结点的父结点下标就为(i–1)/2.它的左右子结点下标分别为2 * i + 1和2 * i + 2.如第0个结点左右子结点下标分别为1和2. 堆的操作:insert 插入一个元素:新元素被加入到heap的末尾,然后更新树以恢复堆的次序. 每次插入都是将新数据放在数组

C 数据结构堆

引言 - 数据结构堆 堆结构都很耳熟, 从堆排序到优先级队列, 我们总会看见它的身影. 相关的资料太多了, 堆 - https://zh.wikipedia.org/wiki/%E5%A0%86%E7%A9%8D 无数漂亮的图片接二连三, 但目前没搜到一个工程中可以舒服用的代码库. 本文由此痛点而来. 写一篇奇妙数据结构堆的终结代码. 耳熟终究比不过手热 ->--- 对于 heap 接口思考, 我是这样设计 #ifndef _H_HEAP #define _H_HEAP // // cmp_f

基本数据结构 —— 堆以及堆排序(C++实现)

目录 什么是堆 堆的存储 堆的操作 结构体定义 判断是否为空 往堆中插入元素 从堆中删除元素 取出堆中最大的元素 堆排序 测试代码 例题 参考资料 什么是堆 堆(英语:heap)是计算机科学中一类特殊的数据结构的统称.堆通常是一个可以被看做一棵树的数组对象.堆总是满足下列性质: 堆中某个节点的值总是不大于或不小于其父节点的值: 堆总是一棵完全二叉树. 通常将根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小堆或小根堆. 堆的存储 堆一般使用数组存储.当堆中有n个元素的时,可以将这些元素存放

数据结构与算法-----&gt;数据结构-----&gt;堆

13.1概述 堆是一种二叉树,是一种特殊的二叉树 同样的一组节点,形成的堆可能不一样,最后形成的堆和节点的插入顺序有关.堆中删除最大关键值节点(即根节点)后再将该节点插入到堆中,得到的新的堆和之前的堆是不一样的. *堆可以用来实现优先级队列,用堆实现的优先级队列插入和删除的时间复杂度都是O(logN)

数据结构-堆的实现

堆本质是一棵二叉树,其中所有的元素都可以按全序语义进行比较.用 堆来进行存储需要符合以下规则: 1.元素可比较性:数据集中的元素可以进行比较,就是要实现Comparable接口:. 2.节点最大/最小性:每个节点的元素必须大于或小于该节点的孩子节点的元素: 3.堆是一棵完全二叉树. 堆有两种:最大堆和最小堆. 最小堆中每个节点的优先级小于或者等于它的子节点:最大堆则相反,每个节点的优先级都大于或者等于它的子节点. 如下图: 本文只着重讲最大堆吧,最小堆是一样的. 堆的大小是提前知道的,在java