版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/shytry/article/details/78892704
堆是二叉树,可以使用二叉树数据结构表示堆。
特征:
1、它是个完全二叉树
2、它的每个结点都大于等于它的任何孩子结点
对于位置i处的结点,它的左孩子在2×i+1处,右孩子在2×i+2处,其父结点在(i-1)/2处。
import java.util.ArrayList;
/**
* 实现堆的类
* 使用线性数组实现
*/
public class Heap {
/*使用线性数组存储堆中数据*/
private java.util.ArrayList list=new java.util.ArrayList<Object>();
public Heap(){}
public Heap(Object [] objects){
for(int i=0;i<objects.length;i++)
add(objects[i]);
}
/*向堆中添加元素*/
public void add(Object object){
list.add(object);
if(list.size()!=0){
int temp=list.size()-1;
while(((Comparable)object).compareTo(list.get((temp-1)/2))>0&&temp>0){
Object x=list.get((temp-1)/2);
list.set((temp-1)/2,object);
list.set(temp,x);
temp=(temp-1)/2;
}
}
}
/*输出堆中元素*/
public void out(){
out(list);
}
public void out(ArrayList list){
for(Object o:list) System.out.print(o+" ");
}
/*获取堆的长度*/
public int size(){
return list.size();
}
/*删除堆的某一指定元素*/
public void remove(Object o){
/*删除元素*/
boolean bool=false;
for(int i=0;i<list.size();i++){
if(o==list.get(i)){
/*删除目标元素*/
Object last=list.get(list.size()-1);
list.set(list.size()-1,list.get(i));
list.set(i,last);
list.remove(list.size()-1);
int tem=0;
while(tem<list.size()){
//System.out.println(tem);
if(tem*2+2<list.size()){
if(((Comparable)list.get(2*tem+1)).compareTo(list.get(tem*2+2))>0&&((Comparable)list.get(2*tem+1)).compareTo(list.get(tem))>0){
Object ob=list.get(2*tem+1);
list.set(2*tem+1,list.get(tem));
list.set(tem,ob);
tem=tem*2+1;
}else if(((Comparable)list.get(2*tem+2)).compareTo(list.get(tem*2+1))>0&&((Comparable)list.get(2*tem+2)).compareTo(list.get(tem))>0){
Object ob=list.get(2*tem+2);
list.set(2*tem+2,list.get(tem));
list.set(tem,ob);
tem=tem*2+2;
}
}else if(tem*2+1<list.size()&&((Comparable)list.get(2*tem+1)).compareTo(list.get(tem))>0){
Object ob=list.get(2*tem+1);
list.set(2*tem+1,list.get(tem));
list.set(tem,ob);
tem=tem*2+1;
}else
break;
}
return o;
}
}
if(bool==false)
System.out.println("不存在该数据!");
}
}