二叉堆也是一种二叉树,只不过底层使用数组来实现的,数组元素按照树的结构来摆放,二叉堆,必须满足两个条件:
一、是一个完全二叉树,即叶子节点之间的高度要小于等于1。
二、父节点必须大于子节点(大顶堆)。
比较重要的两个性质:
父节点的索引=(左子节点的索引-1)/2
=(右子节点的索引-1)/2
左子节点的索引=父节点的索引 x 2+1
右子节点的索引=父节点的索引 x 2+2
有了这些知识就可以自己实现一个二叉堆了
public class ErChaDui<T extends Comparable<T>> {
private ArrayList<T> list;
public ErChaDui(int size) {
list=new ArrayList(size);
}
public ErChaDui(){
list=new ArrayList();
}
public ArrayList<T> getList(){
return list;
}
public int size(){
return list.size();
}
public void add(T t){
list.add(t);
this.up();
}
public T remove(){
if(list.size()==0){
return null;
}
swap(0,list.size()-1);
T t=list.remove(list.size()-1);
down();
return t;
}
private void swap(int aIndex,int bIndex){
T t= (T) list.get(aIndex);
list.set(aIndex,list.get(bIndex));
list.set(bIndex,t);
}
//上浮
private void up() {
if(list.size()==0){
return;
}
int index=list.size()-1;
while (index>0){
if(list.get(index).compareTo(list.get(index-1))>0){
if(list.get(index).compareTo(list.get((index-1)/2))>0){
swap(index,(index-1)/2);
index=(index-1)/2;
continue;
}
break;
}
else {
if(list.get((index-1)/2).compareTo(list.get(index-1))<0){
swap(index-1,(index-1)/2);
index=(index-1)/2;
continue;
}
break;
}
}
}
//下沉
public void down(){
int index=0;
while ((index*2+2)<=list.size()-1){
if(list.get(index*2+1).compareTo(list.get(index*2+2))>0){
if(list.get(index).compareTo(list.get(index*2+1))<0){
swap(index,index*2+1);
index=index*2+1;
continue;
}
break;
}
else {
if(list.get(index).compareTo(list.get(index*2+2))<0){
swap(index,index*2+2);
index=index*2+2;
continue;
}
break;
}
}
}
public void list(){
for (T t : list) {
System.out.print(t+" ");
}
}
}