一、什么是二叉堆
二叉堆在数据结构上是完全二叉树。完全二叉树即:除了最后两层的节点外,所有节点具有两个子节点的二叉树。最底层的数据按照从左到右依次排列。
同时,节点满足:父节点存储的值总是大于或者总是小与子节点的存储的值。
最大堆:父节点的键值总是大于或等于任何一个子节点的键值。
最小堆:父节点的键值总是小于或等于任何一个子节点的键值。
如下图所示,图a是一个二叉堆,而图b不是。
图a
图b
二、二叉堆的特点
因为完全二叉树的特殊性,可以使用数组来存储而不用链式存储。如下图2所示,图2(a)中的数组对应图(b)中的二叉堆。
从图中可以看出:数组中i元素对应的左子树在数组的2i的位置上,右子树在2i+1的位置上,其父亲在floor(i/2)的位置上。
利用该特性很容易在用数组存储的二叉堆中找出一个节点的左右子树和父亲节点。
三、c++实现二叉堆的基本操作
二叉堆的一切操作建立与堆中父节点存储的值总是大于或者总是小与子节点的存储的值。以下我们均讨论的是父亲节点存储的值小与子节点存储的值的情况。
1、二叉堆的数据结构定义
BinaryHeap.h文件:
#include <vector>
using std::vector;
template < typename T>
class BinaryHeap {
public:
BinaryHeap (int capacity = 100) ;
BinaryHeap (vector<T> &item) ;
~BinaryHeap(){}
bool isEmpty ();
void insert (const T & x);
void deleteMin ();
void deleteMin (T & minItem);
void makeEmpty ();
void showHeap();
private:
int currentSize;
vector<T> array;
void percolateDown (int hole);
void buildHeap ();
};
2、二叉堆的插入
向二叉堆中插入一个数需要保持二叉堆的特性。首先,