二叉堆(一个满足特定条件的完全二叉树)相关的内容,比较抽象。
import java.util.Arrays;
//二叉堆实际就是一个完全二叉树,即最后一个叶子节点前的所有节点都在。
//二叉堆存储在数组中。
/*二叉堆有两个类型:
* 一个是最大堆——任何一个父节点都大于或者等于它左右孩子节点的值,
* 一个是最小堆——任何一个父节点都小于或者等于它左右孩子节点的值。
*/
public class HeapTest {
//二叉堆(最小堆)的“上浮”操作
//从最后一个叶子节点开始,小于父节点就进行上浮操作。
public static void upAdjust(int[] array) {
int childIndex=array.length-1;
int parentIndex=(childIndex-1)/2;
int temp=array[childIndex];
while(childIndex>0 && temp>array[parentIndex]) {
array[childIndex]=array[parentIndex];
childIndex=parentIndex;
parentIndex=(parentIndex-1)/2;
}
array[childIndex]=temp;
}
//二叉堆(最小堆)的“下沉”操作
//array 要进行下沉操作的堆(数组)
//parentIndex 要下沉的父节点
//length 当前下沉堆(数组)的长度
private static void downAdjust(int[] array, int parentIndex, int length) {
// TODO Auto-generated method stub
int temp=array[parentIndex];
int childIndex=2*parentIndex+1;
while(childIndex<length) {
if(childIndex+1<length && array[childIndex]>array[childIndex+1]) {
childIndex++;
}
if(temp<=array[childIndex]) {
break;
}
array[parentIndex]=array[childIndex];
parentIndex=childIndex;
childIndex=childIndex*2+1;
}
array[parentIndex]=temp;
}
//二叉堆(最小堆)的构建
//从最后一个父节点开始“下沉”操作,构建最小堆。
public static void buildHeap(int[] array) {
for(int i=(array.length-2)/2;i>=0;i--) {
downAdjust(array,i,array.length);
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] array = new int[] {1,3,2,6,5,7,8,9,10,0};
upAdjust(array);
System.out.println(Arrays.toString(array));
array=new int[] {7,1,3,10,5,2,8,9,6};
buildHeap(array);
System.out.println(Arrays.toString(array));
}
}