堆实现:
二叉树 - 我使用数组模拟实现的二叉树
大顶堆和小顶堆,小顶堆就是每一个父节点都比他的子节点的值大,故,根节点最大嘛
比较重要的公式:
计算父节点:(n - 1) / 2
计算子节点:左节点n * 2 + 1,右节点n * 2 + 2
面试必考方法:
初始堆的建立
java
private void heapify(){
// 遍历所有的非叶子节点
for(int i = size / 2 - 1; i >= 0; i--){
// 下潜
down(i);
}
}
上浮
java
private void up(int offered){
int child = size;
// parent与offered作比较
while(child > 0){
int parent = (child - 1) / 2;
if(offered > arr[parent]){
arr[child] = arr[parent];
child = parent;
}else{
break;
}
}
arr[child] = offered;
}
下潜
java
private void down(int p){
int left = p * 2 + 1;
int right = left + 1;
int max = p;
if(max < size && arr[left] > arr[max]){
max = left;
}
if(max < size && arr[right] > arr[max]){
max = right;
}
if(p != max){
swap(p, max); // 交换两个节点
down(max); // 递归调用
}
}
应用场景
我就直接上力扣了:
- 合并K的有序数组
- 求数组第K大元素
- 求数据流第K大元素
- 求数据流中位数