简介
堆是一种特殊的数据结构,满足以下两个性质:
- 堆中结点的值总是小于或者大于父节点的值
- 堆总是一颗完全二叉树
堆是一颗完全二叉树,在这棵树中,所有的父节点都满足大于等于其子节点的堆叫大根堆,所有的父节点都小于子节点的叫小根堆
堆虽然是一棵树但是一般存值存在数组中,父节点和子节点的关系通常通过下标来确定
实现
思路:如下图所示,当编号从零开始的时候:左孩子:(i + 1) * 2 - 1 右孩子: (i - 1) * 2 父节点:(i - 1) / 2。本次创建的是小根堆。
public class ArrayHead {
private int data[];
//初始化
public ArrayHead(int size){
data = new int[size];
}
//左孩子的位置
public int leftChild(int i){
return (i+1)*2 -1;
}
//右孩子的位置
public int rightChild(int i){
return (i+1)*2;
}
//父节点的位置
public int parentNode(int i){
return i - 1 / 2;
}
//保持所以的父节点都小于子节点(小根堆) 思路:就是让它的根节点始终比
public void keepData(int i){
//左孩子
int left = leftChild(i);
//右孩子
int right = rightChild(i);
//当左孩子大于父节点的时候
if(data[left] < data[i]){
int temp = 0;
temp = data[left];
data[left] = data[i];
data[i] = temp;
}
//当右孩子大于父节点的时候
if(data[right] < data[i]){
int temp = 0;
temp = data[right];
data[right] = data[i];
data[i] = temp;
}
}
}