开篇说一下关于树相关的类型:
树(至少2个子节点)=> 二叉树(最多2个子节点) => 完全二叉树(有一个左子节点或者同时有左右子节点)
=> 最小堆也叫优先队列,任何一个父节点都不大于左右子节点。
最小堆对应的有最大堆,区别在于父节点比子节点小还是大。 最小堆可以使用链表表示(需要三个指针),也可以用数组表示。
在这里只说明数组实现的最小堆创建和排序。
首先说最小堆的位置都满足此规律: 第一个元素从数组下标1开始,每个节点n的父节点都是 n/2, 子节点是 2*n , 2*n+1。所以创建也是从数组1下标开始。
创建方法:
从最后一个非叶子节点开始,依次向根节点1遍历, 比较当前节点与子节点的大小,如果父节点比任一子节点大,则调换两者位置或交换值, 同时需要对新的子节点重新对比。
int h[] ; //无序队列,从下标1开始。
int n = sizeof(h)/sizeof(*h) - 1; //n是要创堆的元素个数
static inline void swap(int a, int b){
h[a] ^= h[b]; h[b] ^= h[a]; h[a] ^=h[b];
}
void strip(int