二叉堆的建立
算是对STL的一道练习题
思想:
1.建立向量a,输入测试数据
2.基于数组下标,判断当前堆顶是否已满足要求
Code:
#include <cstdio>
#include <vector>
#include <algorithm>
#include <functional>
using namespace std;
// 传入数组a和下标i,i的左右子树都满足最大堆的性质,函数将a整体调整为最大堆
void heap_down(std::vector<int>&a, int i){
while( i < a.size()){// 只要i不超过数组长度,就不断向下调整
int left = 2*i+1;// 计算i的左子节点下标
int right = 2*i+2;// 计算i的右子节点下标
int maximum = i;// 设置maximum存储i和左右子节点较大节点的下标,初始化为i
// 如果左子树存在且a[maximum]小于a[left]
if(left < a.size()&&a[maximum] < a[left]){
maximum = left;// 更新maximum为left
}
// 如果右子树存在且a[maximum]小于a[right]
if(right < a.size()&&a[maximum] < a[right]){
maximum = right;// 更新maximum为right
}
if(maximum == i){// 如果此时maximum 仍等于i
break;// 说明a[i]比左右子节点都大,后面就不需要再调整了,跳出循环
}
// 交换a[i]和a[maximum]
int temp = a[i];
a[i] = a[maximum];
a[maximum] = temp;
i = maximum;// 将i指向maximum,继续向下调整
}
}
// 建堆可以调用heap_down来实现
void make_heap(vector<int>&a){
for(int i = a.size()-1; i >= 0; i--){
heap_down(a,i);// 从后向前调用heap_down调整数组a的每个元素
}
}
int main()
{
vector<int> a;
a.push_back(5);
a.push_back(2);
a.push_back(3);
a.push_back(6);
a.push_back(7);
printf("make_heap default(bigheap):\n");
// 默认情况下,调用make_heap
// 将向量a建立为最大堆
make_heap(a.begin(),a.end());
for(int i = 0; i < a.size(); i++){
printf("a[%d]=%d ",i,a[i]);
}
// 当传入的Compare是gerater时,创建最小堆
printf("\nmake_heap greater<int>(smallheap):\n");
make_heap(a.begin(),a.end(),greater<int>());
for(int i = 0; i < a.size(); i++){
printf("a[%d]=%d ",i,a[i]);
}
// 当传入的Compare是less时,创建最大堆
printf("\nmake_heap less<int>(bigheap):\n");
make_heap(a.begin(),a.end(),less<int>());
for( int i = 0; i < a.size(); i++){
printf( "a[%d]=%d ", i, a[i]);
}
return 0;
}
此段代码非原创代码,仅供学习交流用