二叉堆的定义
二叉堆(英语:binary heap)是一种特殊的堆,二叉堆是完全二叉树或者是近似完全二叉树。二叉堆满足堆特性:父节点的键值总是保持固定的序关系于任何一个子节点的键值,且每个节点的左子树和右子树都是一个二叉堆。
当父节点的键值总是大于或等于任何一个子节点的键值时为“最大堆”。当父节点的键值总是小于或等于任何一个子节点的键值时为“最小堆”。---wiki百科
二叉堆的结构性质与堆序性质
结构性质:二叉堆是一颗完全二叉树,一棵高为h的完全二叉树有所以完全二叉树的高是logN。
二叉堆的插入操作:(上滤)一个例子即可说明:
二叉堆的删除最小元素操作:
二叉堆的构建堆操作:
代码实现二叉堆
package com_DataStructureAndAlogorithm_Learning;
public class BinaryHeap<AnyType extends Comparable<? super AnyType>> {
public BinaryHeap() {
this(DEAFAULT_CAPACITY);
}
public BinaryHeap(int capacity) {
currentSize=0;
array=(AnyType[]) new Comparable[capacity+1];
}
public BinaryHeap(AnyType [] items) {
currentSize=items.length;
array=(AnyType[]) new Comparable[(currentSize+2)*11/10];
int i=1;
for(AnyType item:items) {
array[i++]=item;
}
buildHeap();
}
private void buildHeap() {
for(int i =currentSize/2;i>0;i--) {
percolateDown(i);
}
}
public void insert(AnyType x) {
if(currentSize==array.length-1)
enlargeArray(array.length*2+1);
int hole=++currentSize;
for(array[0]=x;x.compareTo(array[hole/2])<0;hole/=2) {
array[hole]=array[hole/2];
}
array[hole]=x;
}
public AnyType findMin() {
return array[1];
}
public AnyType deleteMin() {
if(isEmpty()) {
System.out.println("堆为空!");
}
AnyType minItem=findMin();//先找到最小的那个元素
array[1]=array[currentSize--];//将需要重新安排再堆中的最后一个元素拿到第一个位置去,并将数组长度减去1
percolateDown(1);
return minItem;
}
private void percolateDown(int hole) {
int child;
AnyType tmp=array[hole];//先将需要重新插入的数据放入临时变量中
for(;hole*2<=currentSize;hole=child) {//hole=child是记得要接着往下进行操作
child=hole*2;//child是该位置的左节点
if(child!=currentSize&&
array[child+1].compareTo(array[child])<0) {
/*
* 如果右子树的数据较小则将取右子树的数据和tmp进行对比
* 第一次比较:先将左右子树中的最小值拿出来
*/
child++;
}
if(array[child].compareTo(tmp)<0) {
/*
* 将左右子树中较小的值拿出来和temp值进行比较
*/
array[hole]=array[child];
}
else
break;
}
array[hole]=tmp;
}
public boolean isEmpty() {
return currentSize==0;
}
public void makeEmpty() {
currentSize=0;
}
private static final int DEAFAULT_CAPACITY=10;
private int currentSize;
private AnyType[] array;
private void enlargeArray(int newSize) {
AnyType [] oldArr = array;
array = (AnyType []) new Comparable[newSize];
for (int i = 0; i < oldArr.length; i++) {
array[i] = oldArr[i];
}
}
}