堆结构的二叉树存储是:
代码实现如下:
# pragma 一次 # include & lt; iostream> # include & lt; vector> # include & lt; assert.h> using namespace 性传播疾病;//仿函数 template & lt; typename T> struct 更大 { bool 操作符(),(const T ,, l, const T ,, r) { return l 祝辞,r; } }; template & lt; typename T> 少struct { bool 操作符(),(const T ,, l, const T ,, r) { return l & lt;, r; } };//模板参数 template & lt; typename T, typename 来者=Greater,在 堆class { 公众://无参构造函数 堆() :_a(空) {}//有参构造函数 堆(T *,,, size_t 大小) { assert ();//先把数据保存在向量中 for (size_t 小姐:=,0;,小姐:& lt;,大小;,我+ +) { _a.push_back([我]); }//建堆 for (int j =, ((_a.size(),安康;2),/,2);,j 祝辞=,0;,j——) {//向下调整算法 _AdjustDown (j); } } void 推动(const T x)//插入元素 { _a.push_back (x); _AdjustUp (_a.size(),安康;1); } void Pop()//删除元素 { 断言(_a.size(),祝辞,0); 交换(_a [0], _a [_a.size(),安康;1]); _a.pop_back (); _AdjustDown (0); } size_t 尺寸() { return _a.size (); } bool 空() { return _a.empty (); } void print () { for (int 小姐:=,0;,小姐:& lt;, _a.size();,我+ +) { cout & lt; & lt;, _a[我],& lt; & lt;,“,”; } cout & lt; & lt;, endl; } 保护://向下调整算法 void _AdjustDown (size_t 父母) { size_t child =, parent *, 2, +, 1; comer com; while (child & lt;, _a.size ()) {//找出左右孩子中比较大的 if (child +, 1, & lt;, _a.size (),,,, com (_a (child +, - 1),,, _a(孩子))) { 孩子+ +; }//比较父亲和孩子的大小 if (com (_a(孩子),_a(父))) { 交换(_a(孩子),_a(父)); 时间=parent 儿童; *=child parent 2, +, 1; } 其他的 { 打破; } } }//向上调整算法 void _AdjustUp (size_t 孩子) { 断言(child & lt;, _a.size ()); int parent =, (child 安康;1),/,2; comer com; while (child 祝辞,0) {//只需看父节点& lt;根节点 if (com (_a(孩子),_a(父))) { 交换(_a(孩子),_a(父)); 时间=child 家长; parent =, (child 安康;1),/,2; } 其他的 { 打破; } } } 私人: vector & lt; T>, _a; };
需要学习的也就是向上以及向下调整算法。
欢迎大家提出宝贵的意见。
测试用例如下:
void 测试() { int [],=,{, 10, 11日,13日,12日,16日,18日,15日,17日,14日,19日,}; Heap
堆的简单实现(仿函数)