堆数据结构及其插入、提取操作图解

让人想犯罪 __ 提交于 2019-12-02 03:14:04

 

堆的特性

  • 堆是一棵二叉树。根据根节点是最大值或最小值,分别称为最大堆或最小堆。
  • 堆是左平衡树。随着节点增加,树会逐级从左至右增长。
  • 堆比较好的实现方式,是采用数组实现。当i作为节点索引时,其父节点索引为(i-1)/2,其子节点索引分别为2i+1或2i+2,从而可以迅速定位。

堆的结构

  • 这是一个包含5个节点的最大堆,根节点是所有节点的最大值。
  • 在实现上采用数组存储每个节点,按照每一层从左往右排列。

堆的插入操作(Insert)

  • 插入的节点首先写入数组末尾。此时的二叉树可能不满足结构特性,因此需要重组。
  • 当前写入节点值与其父节点比较,如果大于父节点,则交换两个节点的值。(对于最小堆则是在小父节点时上移)
  • 不断向上比较直至到达根节点,或者父节点值不再大于当前插入节点。

堆的提取操作(Extract)

  • 堆的提取操作针对二叉树的根节点。根节点值取出后,需要补位。
  • 首先将堆数组最后一个节点值,补位到根节点。此时对于最大堆,根节点不是最大值,需要下移重组。
  • 将根节点与其两个子节点值进行比较,三节点最大者如果是子节点之一,则根节点与其交换位置。
  • 递归执行上一步骤直至无子节点大于该值。
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!