数据结构之堆(c++)
一、堆的基本操作
堆(我们这里指二叉堆)是一棵完全二叉树,并且祖先节点的所有子孙节点都不小于(或不大于)祖先节点的值。
通常我们把根节点作为第一层的话,那么深度为h的堆就有2^(h-1)~2^h-1个节点,显然拥有N个节点的堆,其高度为lgN。也就是说对堆进行插入语删除操作我们都需要lgN的时间。由于堆的完全树的性质,因此可以用线性结构(数组)来存储。
首先定义堆的一个类,考虑到常用的树的操作,定义了插入节点操作,删除最小节点操作等操作:还有一点需要注意的是,根据堆的特点(祖先节点不大于/小于子孙节点的值),可将堆分为最大堆和最小堆,在此以最大堆举例
(数据结构与算法分析--C++描述一书中以最小堆为例,在此笔者有个疑问,就是此书作者以vector为存储结构,currentSize表示当前堆中元素个数,在判断是否上溢时,以currentSize==array.size()-1为判断条件(其中array为vector),笔者怀疑作者是否搞反了,因为vector::size()返回的是当前元素个数,好吧,我们继续)
#include<cstdio>
#include<exception>
#define MaxSize 1024
using namespace s