-
概念:
堆也叫做优先级队列,入队列的时候同样是和普通队列一样入,但是出队列的时候优先出优先级较高的元素,优先级相同的情况下再按照先进先出的方式进行。堆的实质实际是一棵二叉树,并且这颗二叉树需要满足以下三个条件:
①:
满足完全二叉树的条件,也就是当某个节点没有子节点或者没有右节点之后,它后面的所有节点都不能再有子节点。
②:
对于整棵树中的任意某颗子树,都要满足根节点的值小于或者大于左右子节点的值,称为小堆和大堆。并且满足小堆就不可能满足大堆,反之亦然。
堆通常通过数组来进行存储,通过层序遍历一棵满足以上条件的完全二叉树,将遍历结果存储到数组中,就得到了一个优先级队列。 -
堆的操作:
①向下调整:当堆顶元素也就是队首元素发生改变之后,整个堆的规则就被打乱了,需要重新进行调整。
前提:左右子树满足堆的规则。
以小堆为例
public static void func(int size,int[] arr,int K){
int parent = K;
int child = parent*2+1;//通过父节点的下标计算出子节点的下标
while(child<size){//child<size代表当前子节点是存在的。不能取等于是因为size是个数,从1开始计算,child是下标,从0开始
if(child+1<size&&child+1<child){//child+1代表child这个节点的兄弟节点,小于size代表它也是存在的