二叉堆的构建(Java)

时间:2023-03-09 18:32:21
二叉堆的构建(Java)
 package com.rao.linkList;

 /**
* @author Srao
* @className BinaryHeap
* @date 2019/12/3 14:14
* @package com.rao.linkList
* @Description 二叉堆
*/
public class BinaryHeap { /**
* 在插入一个节点之后,数组进行上浮
* @param arr:左孩子等于n*2+1,右孩子等于n*2+2
* @param length:表示数组的长度
*/
public int[] upAdjust(int[] arr, int length){
//代表新插入的节点的下标
int child = length - 1; //求出父节点的下标
int parent = (child-1)/2; //获得插入的节点
int temp = arr[child]; //与父节点进行比较,如果父节点大于子节点,就把父节点赋值给子节点,然后把子节点指向父节点
while (child > 0 && arr[parent] > temp){
arr[child] = arr[parent];
child = parent;
//无论时左孩子还是右孩子,求父节点都是用这个公式
parent = (child-1)/2;
} //如果父节点比子节点要小,此时arr[parent] < temp
arr[child] = temp;
return arr;
} /**
* 在二叉堆当中,一般是删除根元素,在删除根元素之后,把最后一个元素当作根元素,然后进行下沉
* @param arr
* @param parent:被当作根元素的节点,从这个元素开始下沉
* @param length:数组的长度
* @return
*/
public int[] downAdjust(int[] arr, int parent, int length){
//获取临时的根节点
int temp = arr[parent]; //计算左孩子节点
int child = parent*2+1; //进行下沉操作
while (child < length){
//先对比左右孩子的大小,用小的那一个进行操作
if (child+1 < length && arr[child+1] < arr[child]){
child++;
}
//如果父节点比子节点小,就直接退出
if (temp <= arr[child]){
break;
}else {//如果父节点比子节点大,就把子节点赋值给父节点
arr[parent] = arr[child];
//让父节点指针指向子节点
parent = child;
child = parent*2+1;
}
}
arr[parent] = temp;
return arr;
} /**
* 根据数组构建一个二叉堆
* @param arr:数组
* @param length:数组长度
* @return 不能从二叉堆的第一个元素开始下沉,要用二叉堆的最后一个非叶子节点开始下沉
* 如果从二叉堆的根节点开始下沉,那么可能最上面的三个元素时二叉堆,但是下面的元素还是乱的
*/
public int[] bulidHeap(int[] arr, int length){
for (int i = (length-1)/2; i>=0; i--){
downAdjust(arr, i, length);
}
return arr;
} }

https://www.cnblogs.com/skywang12345/p/3610187.html

上面的博客中有比较好的图,可以参考一下,按着那个图我用Java实现了一下,注释也写的比较全面