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

Posted lyrich

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了写给自己看的二叉堆:基本操作相关的知识,希望对你有一定的参考价值。

搬运自我的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 

 

以上是关于写给自己看的二叉堆:基本操作的主要内容,如果未能解决你的问题,请参考以下文章

根在 arr[0] 的二叉堆有啥好处

暖*墟 #二叉堆# 大根堆的常见操作

合并果子(二叉堆)

python 二叉堆

二叉堆和堆排序(binary heap)

二叉堆和堆排序