这是我参与8月更文挑战的第6天,活动详情查看:8月更文挑战
堆
一种比较特殊的数据结构,可以被看做一棵树的数组对象;
是可以迅速找到一堆数中的`最大值`或者`最小值`的数据结构,所以堆可以用来实现优先队列。
特点
1、必定是完全二叉树,所以一定是平衡二叉树。
什么是完全二叉树?
完全二叉树的特点:
1、叶子结点只能出现在最下层和次下层。
2、最下层的叶子结点集中在树的左部。
3、倒数第二层若存在叶子结点,一定在右部连续位置。
4、如果结点度为1,则该结点只有左孩子,即没有右子树。
5、同样结点数目的二叉树,完全二叉树深度最小。
意思是说完全二叉树的节点是自上而下,自左向右的;树的上层节点没放满之前是不会放下一层的,同一层左节点全部放满才放右节点;如下图
2、分为大顶堆和小顶堆
大顶堆
在大顶堆中:任意节点的值比其子树节点的值都要大
小顶堆
在小顶堆中:任意节点的值比其子树节点的值都要小
3、因为堆有序的特点,一般用来做数组中的排序,称为堆排序。
堆节点的访问
- 父节点i的左子节点所在位置(2i+1)
- 父节点i的右子节点所在位置(2i+2)
- 子节点i的父节点所在位置(i-1)/2向下取整
排序的基本思路
- 无序的堆序列
- 将每个父节点跟左右子节点作比较,将大/小的子节点和父节点做交换,直到将堆变成最小堆或者最大堆
- 将堆顶的值跟未排序的二叉树最后的一个节点做交换
- 一直重复这些步骤,直到排序完成
适用场景
- 构建优先队列(堆顶总是最大(最小)元素)
- 堆排序
- 寻找最大值/最小值