二叉堆的性质:1.堆中任意节点的值总是不大于(不小于)其子节点的值。2.二叉堆是一颗二叉完全树,一般可以用数组直接表示。如果数组二叉堆下表从0开始, n大于0且为偶数时,该节点是其父节点的右节点。n大于0且为奇数时候,该节点是其父节点的左节点。n的父节点是(n-1)/2。n的两个子节点(如果有的话)2n+1(左),2n+2(右)。
二叉堆的建立
package demo10;
import java.util.ArrayList;
public class test {
static int[] A = {5 , 2, 4, 1, 3, 0, 6, 7, 8, 9, 10, 11, 12, 13, 14};
static ArrayList<Integer> B = new ArrayList<Integer>();
public static void main(String[] args) {
//建堆
for (int i = 0; i < A.length; i++)
B.add(A[i]);
for (int i = B.size() / 2 - 1; i >= 0; i--)
maintain(i);
for (int i = 0; i < B.size(); i++) // 查看是否建堆成功
System.out.println(B.get(i));
}
static void maintain(int indx){
//堆维护
while (indx < B.size() / 2){
//只需对根节点维护
int temp = optimal(indx * 2 + 1, indx, indx * 2 + 2);
if (temp == indx)
break;
else swap(indx, temp);
indx = temp; //对被交换的子节点再进行维护
}
}
private static void swap(int i, int j) {
int temp = B.get(i);
int temp1 = B.get(j);
B.set(i, temp1);
B.set(j, temp);
}
static int optimal(int l,int i,int r){
//依据性质找出最为优先的
if (r > B.size() - 1 && B.get(l) > B.get(i))
i = l;
if (r <= B.size() - 1) {
if (B.get(l) > B.get(i))
i = l;
if (B.get(r) > B.get(i))
i = r;
}
return i;
}
}
二叉堆的删除
private static void Delete() {
// TODO Auto-generated method stub
B.set(0, B.get(B.size() - 1));
B.remove(B.size() - 1); // 把第一个位置的数字改成最后一个位置的数字 然后删除最后一个位置
maintain(0);
}
二叉堆的插入
private static void Insert(int i) {
// TODO Auto-generated method stub
B.add(i);
for (int j = B.size() / 2 - 1; j >= 0; j--) // 添加一条数据然后重新建堆就行
maintain(j);
}