数据结构(堆)
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 定义: 数据结构中的堆是一种特殊的二叉树。 堆 必须符合以下两个条件: 是一棵完全二叉树。 任意一个节点的值都大于(或小于)左右子节点的值。 从第一点可以知道,堆适合用数组来存储。 第二点中,若父节点都大于等于左右子节点,则被称为大顶堆,反之则为 小顶堆。 堆的实现方案 堆的存储 完全二叉树采用数组存储最省空间,并且对 CPU 缓存 比 链表 友好。 如图,采用数组表示并空出 0 号位置,节点 i 的父节点为 2xi ,左右子节点分别为 i/2 和 i/2+1 。 堆的操作—插入数据 在堆尾(即数组末尾)插入数据,会导致破坏堆的特性,如图: 因此需要将被破坏的堆重新调整为堆,这个过程被称为堆化,堆化的操作可以自上而下,也可以自下而上。 图中插入元素8后,打破了大顶堆的特性,将元素8向上与其父节点比较,判断是否交换,若交换,则继续向上比较,直到所有父子节点符合要求。 代码实现(大顶堆): public class Heap { private int[] heapData; // 数组,从下标 1 开始存储数据 private int n; // 堆可以存储的最大数据个数 private int count; // 堆中已经存储的数据个数 public Heap(int capacity) { heapData