写给自己看的二叉堆(1):基本操作

搬运自我的CSDN https://blog.csdn.net/u013213111/article/details/90343879

也就是一棵完全二叉树。堆顶最大则为大根堆,堆顶最小则为小根堆,这里实现的是小根堆。
1.定义
用一个数组来存储数据。

1 typedef int eletype;
2
3 typedef struct heapstruct
4 {
5     int capacity;
6     int size;
7     eletype *arr; //used for saving data
8 }Heap;

2.新建一个二叉堆
给二叉堆分配空间,给存储数据用的数组分配空间。

 1 Heap *CreateHeap(int max)
 2 {
 3     Heap *H;
 4     H = malloc(sizeof(Heap));
 5     if (H == NULL) {
 6         printf("Out of space\n");
 7         return NULL;
 8     }
 9
10     H->arr = malloc(sizeof(eletype) * (max + 1));
11     if (H->arr == NULL) {
12         printf("Out of space\n");
13         return NULL;
14     }
15
16     H->capacity = max;
17     H->size = 0;
18     H->arr[0] = 0;
19
20     return H;
21 }

3.插入
上滤找到合适的插入位置。

 1 eletype DeleteMin(Heap *H)
 2 {
 3     if (H->size == 0) {
 4         printf("Heap is empty\n");
 5         return 0;
 6     }
 7     eletype min = H->arr[1];
 8     eletype last = H->arr[H->size--]; //--!
 9     int i, child;
10     for(i = 1; i * 2 <= H->size; i = child) {
11         //Find smaller child
12         child = i * 2;
13         if (child != H->size && H->arr[child + 1] < H->arr[child])
14             child++;
15         //precolate one leve
16         if (last > H->arr[child])
17             H->arr[i] = H->arr[child];
18         else
19             break;
20     }
21     H->arr[i] = last;
22     return min;
23 }

4.删除最小元素(堆顶)
为了保证删除后仍是一个完整的二叉堆,要将原堆顶以下的数据进行适当的上滤。

 1 eletype DeleteMin(Heap *H)
 2 {
 3     if (H->size == 0) {
 4         printf("Heap is empty\n");
 5         return 0;
 6     }
 7     eletype min = H->arr[1];
 8     eletype last = H->arr[H->size--]; //--!
 9     int i, child;
10     for(i = 1; i * 2 <= H->size; i = child) {
11         //Find smaller child
12         child = i * 2;
13         if (child != H->size && H->arr[child + 1] < H->arr[child])
14             child++;
15         //precolate one leve
16         if (last > H->arr[child])
17             H->arr[i] = H->arr[child];
18         else
19             break;
20     }
21     H->arr[i] = last;
22     return min;
23 }

原文地址:https://www.cnblogs.com/lyrich/p/10960729.html

时间: 2024-11-01 14:48:18

写给自己看的二叉堆(1):基本操作的相关文章

在A*寻路中使用二叉堆

接上篇:A*寻路初探 GameDev.net 在A*寻路中使用二叉堆 作者:Patrick Lester(2003年4月11日更新) 译者:Panic 2005年3月28日 译者序:     这一篇文章,是"A* Pathfinding for Beginners.",也就是我翻译的另一篇文章<A*寻路初探>的补充,在这篇文章里,作者再一次展现了他阐述复杂话题的非凡能力,用通俗易懂的语句清晰的解释了容易让人迷惑的问题.还是那句话,如果你看了这篇文章仍然无法领会作者的意图,那

堆、二叉堆、堆排序

堆.二叉堆.堆排序 堆的概念: n个元素序列 { k1, k2, k3, k4, k5, k6 -. kn } 当且仅当满足以下关系时才会被称为堆: ki <= k2i,ki <= k2i+1 或者 ki >= k2i,ki >= k2i+1 (i = 1,2,3,4 .. n/2) 如果数组的下表是从0开始,那么需要满足 ki <= k2i+1,ki <= k2i+2 或者 ki >= k2i+1,ki >= k2i+2 (i = 0,1,2,3 .. n

【数据结构】二叉堆

看到一篇很好的博文,来自http://blog.csdn.net/morewindows/article/details/6709644 下面是博文内容 堆排序与快速排序,归并排序一样都是时间复杂度为O(N*logN)的几种常见排序方法.学习堆排序前,先讲解下什么是数据结构中的二叉堆. 二叉堆的定义 二叉堆是完全二叉树或者是近似完全二叉树. 二叉堆满足二个特性: 1.父结点的键值总是大于或等于(小于或等于)任何一个子节点的键值. 2.每个结点的左子树和右子树都是一个二叉堆(都是最大堆或最小堆).

浅析基础数据结构-二叉堆

如题,二叉堆是一种基础数据结构 事实上支持的操作也是挺有限的(相对于其他数据结构而言),也就插入,查询,删除这一类 对了这篇文章中讲到的堆都是二叉堆,而不是斜堆,左偏树,斐波那契堆什么的 我都不会啊 一.堆的性质 1.堆是一颗完全二叉树 2.堆的顶端一定是“最大”,最小”的,但是要注意一个点,这里的大和小并不是传统意义下的大和小,它是相对于优先级而言的,当然你也可以把优先级定为传统意义下的大小,但一定要牢记这一点,初学者容易把堆的“大小”直接定义为传统意义下的大小,某些题就不是按数字的大小为优先

集训队7月31日(二叉堆和哈曼夫树)

今天上午学习了二叉堆和哈曼夫树,算法竞赛指南80~92页. 先说一下我对二叉堆和哈曼夫树的理解,二叉堆分为大根堆,小根堆,而哈曼夫树就是二叉堆的一种表现形式,在解决一些权值带深度的一些问题上是一个良好的思路,简而言之,这两个东西可以表示为维护一个优先队列. 学了这两个知识,写了三个题. 1.二叉堆+贪心+链表 https://www.cnblogs.com/2462478392Lee/p/11279484.html多校 2.哈夫曼树 https://www.cnblogs.com/2462478

纯数据结构Java实现(6/11)(二叉堆&amp;优先队列)

堆其实也是树结构(或者说基于树结构),一般可以用堆实现优先队列. 二叉堆 堆可以用于实现其他高层数据结构,比如优先队列 而要实现一个堆,可以借助二叉树,其实现称为: 二叉堆 (使用二叉树表示的堆). 但是二叉堆,需要满足一些特殊性质: 其一.二叉堆一定是一棵完全二叉树 (完全二叉树可以用数组表示,见下面) 完全二叉树缺失的部分一定是在右下方.(每层一定是从左到右的顺序优先存放) 完全二叉树的结构,可以简单理解成按层安放元素的.(所以数组是不错的底层实现) 其二.父节点一定比子节点大 (针对大顶堆

【转】二叉堆与优先队列

目录 1.插入 2.删除 3.查询 1.堆排序 2.用两个堆来维护一些查询第k小/大的操作 中位数 3.利用堆来维护可以“反悔的贪心” 如题,二叉堆是一种基础数据结构 事实上支持的操作也是挺有限的(相对于其他数据结构而言),也就插入,查询,删除这一类 对了这篇文章中讲到的堆都是二叉堆,而不是斜堆,左偏树,斐波那契堆什么的 我都不会啊 更新概要: 无良博主终于想起来要更新辣 upd1:更新5.2.2-对于该子目所阐述的操作“用两个堆来维护一些查询第k小/大的操作”更新了一道例题-该操作对于中位数题

堆排序:什么是堆?什么是最大堆?二叉堆是什么?堆排序算法是怎么样的?PHP如何实现堆排序?

本文标签:  堆排序 php php算法 堆排序算法 二叉堆 数据结构 REST   服务器 什么是堆 这里的堆(二叉堆),指得不是堆栈的那个堆,而是一种数据结构. 堆可以视为一棵完全的二叉树,完全二叉树的一个"优秀"的性质是,除了最底层之外,每一层都是满的,这使得堆可以利用数组来表示,每一个结点对应数组中的一个元素. 数组与堆之间的关系 二叉堆一般分为两种:最大堆和最小堆. 什么是最大堆 堆中每个父节点的元素值都大于等于其孩子结点(如果存在),这样的堆就是一个最大堆 因此,最大堆中的

AC日记——二叉堆练习3 codevs 3110

3110 二叉堆练习3 时间限制: 3 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description 给定N(N≤500,000)和N个整数(较有序),将其排序后输出. 输入描述 Input Description N和N个整数 输出描述 Output Description N个整数(升序) 样例输入 Sample Input 5 12 11 10 8 9 样例输出 Sample Output 8 9 10 11 12 数据范围及提示 Data Si