由于堆具有 完全二叉树 的特性,所以可以使用数组来进行储存。
完全二叉树:指的是除了最后一层外的其他每一层被完全填充,并且所有结点都保持向左对齐。
将根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小堆或小根堆。
假设此时堆数组定义为nums[]
当前节点为node
public class Main {
public static void main(String[] args) {
int[] nums = {1,6,2,5,8,4,3};
for(int i=nums.length/2-1;i>=0;i--){//nums.length/2-1为最后一个非叶子节点
maxHeap(nums,i);
}
System.out.println(Arrays.toString(nums));
}
private static void maxHeap(int[] nums,int node){
int left=node*2+1;//左子节点的下标=父节点的下标*2+1
int right=node*2+2;//右子节点的下标=父节点的下标*2+2
//-------------左右节点与父节点比较--------------------
int max=node;
if(left<nums.length&&nums[node]<nums[left]){
max=left;
}
if(right<nums.length&&nums[max]<nums[right]){
max=right;
}
//---------max是父节点和左右子节点中最大的数-------------------
if(max!=node){//max!=node证明左右子节点有比父节点大的数,需要进行交换
swap(nums,node,max);//交换
maxHeap(nums,max);//需要重新判断交换后的子节点是否符合父节点最大
}
//左右子节点没有比父节点大的数,符合最大堆无需交换
}
private static void swap(int[] nums,int num1,int num2){
int tmp = nums[num1];
nums[num1]=nums[num2];
nums[num2]=tmp;
}
}