堆的特性
- 堆是一棵二叉树。根据根节点是最大值或最小值,分别称为最大堆或最小堆。
- 堆是左平衡树。随着节点增加,树会逐级从左至右增长。
- 堆比较好的实现方式,是采用数组实现。当i作为节点索引时,其父节点索引为(i-1)/2,其子节点索引分别为2i+1或2i+2,从而可以迅速定位。
堆的结构
- 这是一个包含5个节点的最大堆,根节点是所有节点的最大值。
- 在实现上采用数组存储每个节点,按照每一层从左往右排列。
堆的插入操作(Insert)
- 插入的节点首先写入数组末尾。此时的二叉树可能不满足结构特性,因此需要重组。
- 当前写入节点值与其父节点比较,如果大于父节点,则交换两个节点的值。(对于最小堆则是在小父节点时上移)
- 不断向上比较直至到达根节点,或者父节点值不再大于当前插入节点。
堆的提取操作(Extract)
- 堆的提取操作针对二叉树的根节点。根节点值取出后,需要补位。
- 首先将堆数组最后一个节点值,补位到根节点。此时对于最大堆,根节点不是最大值,需要下移重组。
- 将根节点与其两个子节点值进行比较,三节点最大者如果是子节点之一,则根节点与其交换位置。
- 递归执行上一步骤直至无子节点大于该值。
来源:oschina
链接:https://my.oschina.net/luckysym/blog/3135911