堆数据结构是一种数组对象,它可以被视为一棵完全二叉树结构。
堆结构的二叉树存储:
大堆:每个父节点的都大于孩子节点;小堆:每个父节点的都小于孩子节点。
建堆:由于堆被视为完全二叉树,故在h-1层找到第一个(从后往前找)非叶子结点,进行堆的下调
建大堆时,从下往上依次判断并调整堆,使该结点的左右子树都满足大堆
建小堆时,从下往上依次判断并调整堆,使该结点的左右子树都满足小堆
可见大堆的建立与小堆的建立方式类似,下面以大堆进行讨论。
利用vactor模板存储堆中元素
template<class T>
class Heap
{
public:
Heap();
Heap(const T* a, size_t size);
void Push(const T& x);
void Pop();
T& GetTop();//访问堆顶元素
bool Empty();//判空
size_t Size();//堆元素个数
void PrintHeap();
protected:
void _AdjustDown(size_t Parent);//下调--建大堆(每个父结点都大于孩子结点)
void _AdjustUp(size_t Child);//上调--建小堆(每个父结点都小于孩子结点)
private:
vector<T> _a;
};