题目三
堆
1,堆结构就是用数组实现的完全二叉树结构
2,完全二叉树中如果每棵子树的最大值都在顶部就是大根堆
3,完全二叉树中如果每棵子树的最小值都在顶部就是小根堆
4,堆结构的heaplnsert与heapify操作
5,堆结构的增大和减少
6,优先级队列结构,就是堆结构
完全二叉树:满二叉树树或者从左向右变满的二叉树
i的左孩子:i * 2 + 1
i的右孩子:i * 2 + 2
i的父亲:(i-1)/2
大根堆:每一颗子树的最大值就是根节点
小根堆:每一颗子树的最小值就是根节点
heaplnsert操作:节点向上移动的过程
heapify操作:节点向下移动的过程
heaplnsert
初始heapsize=0,用户依次给数字,组成一个大根堆。
//某个数现在处在index位置,往上继续移动
public static void heapInsert(int[] arr, int index) {
while (arr[index] > arr[(index - 1) / 2]) {
swap(arr, index, (index - 1) / 2);
index = (index - 1) / 2;
}
}
根的父亲:(0-1)/2=0
heapify 堆化
一个节点向下移动的过程
比如,移除最大值,并求第二大值。首先移除根,然后将最后一个节点放在根上,让下移,成为大根堆。
//某个数在index位置,能否往下移动
public static void heapify(int[] arr, int index, int heapSize) {
int left = index * 2 + 1; //左孩子的下标
while (left < heapSize) {
</