https://www.icourse163.org/learn/ZJU-93001#/learn/content?type=detail&id=1211167093&cid=1213729247
堆的两个特性:
- 结构性:用数组表示的完全二叉树
- 有序性:任意结点的关键字是其子树所有节点的最大或最小值
创建堆
[block]
public class create{ int Size; int Capacity; int[] emlements; public create(int maxSize){ elements=new int[maxSize]; } }
[/block]
堆的插入:
[block]
public void Insert(maxHeap H,int item){
int i;
if(isFull(H)){//堆已满
return;
}
i=++H.Size;//i指向堆的最后一个位置
for(;H.elements[i/2]<item;i/=2)//如果i比父节点(i/2)的值大就执行该循环并把父节点下移,i指向原来父节点位置
H.emements[i]=H.elements[i/2];
H.elements[i]=item;
}
[/block]
删除结点:
基本思路:拿最后一个元素替补被删除的根节点,然后再调整树的结构
public class delect{
public delect(Maxheap H){
int parent,child;
ElementType max,temp;
if(堆是空的){
return;
}
max=H.Element[1];//取出根节点最大值
temp=h.Element[H.Size--];//最大堆的最后一个结点
for(parent=1;chile*2<=H.Size;parent=child){
child=2*parent;//找到最大子节点
if(child!=H.Size&&H.Element[child]<H.Element[child+1]){
chile++;
}
if(temp>=H.Element[child]){//如果找到temp该呆的位置
break;
}else{//移动到下一层找
H.Element[parent]=h.Element[child];
}
}
H.Element[parent]=temp;
return max;
}
}