什么是堆?

首先,堆是一个具有特定结构的二叉树;这个二叉树需要满足:节点的值一定大于等于其每个子节点的值。即,堆有序。当节点的值大于其每个子节点的值时,这样的堆称为大堆。当节点的值小于等于每个子节点的值时,这样的堆称为小堆.如果没有特别说明,下文中的堆指的是大堆。

有序堆的性质:

  1. 从某个节点沿着某个分支往下会得到一个非递增的元素列表。
  2. 从某个节点往上,我们会得到一个非递减的元素列表。
  3. 根节点一个是堆中值最大的节点。

    二叉堆的表示方法

    指针表示

    如果要用指针来表示堆,那么每个元素都需要三个指针来找到它的上下节点(一个指针来寻找父节点,两个指针来寻找两个子节点)。其结构如下:
    1. interface Heap<T>{
    2. left: Heap | null;
    3. value: T;
    4. right: Heap | null;
    5. parent: Heap | null;
    6. }

    数组表示

    如果把堆用完全二叉树表示的话,就可以使用数组来表示堆。需要注意的是,使用数组表示堆的时候,数组的第一个位置是不使用的。在使用数组表示堆的时候,对于节点k来说,其父子节点的关系如下:
  • arr[k]为本身节点
  • arr[k/2]为父节点
  • arr[2k]为其左子节点
  • arr[2k+1]为其右子节点