#include<iostream>
using namespace std;
#define MAXZ 100
#define RES 10
class heap {
int *T;
int cap;
int len;
public:
heap();
heap(int);
~heap();
void up(int);
void down(int,int);
void interts(int);
int remove(int);
void show();
int get_ind(int);
};
heap::heap()
{
len = 0;
cap = MAXZ;
T = new int[cap];
}
heap::heap(int n)
{
len = 0;
cap = n + MAXZ;
T = new int[cap];
}
heap::~heap()
{
len = 0;
cap = 0;
delete[] T;
}
int heap :: get_ind(int e)
{
int i;
for (i = 1; i <= len; ++i)
if (T[i]==e)
return i;
if (i > len)
return -1;
}
void heap::up(int e)
{
int tmp = T[e];//存下要移动节点的值
int now = e;//当前节点下标now
int f = (e / 2);//父节点下标f
while (now > 1)//如果now>1,即没有移动到父节点,则继续寻找
{
if (T[f] > tmp)//如果父节点大于了该点,则找到了正确的位置,查找结束
break;
else//如果小于了
{
T[now] = T[f];//交换值
now = f;//并将下标往上移动到原父节点的位置
f = (f / 2);//并且寻找新的父节点
}
}
T[now] = tmp;//最后再将我们的值传给正确的位置
}
void heap::down(int s,int t)
{
int tmp = T[s];
int now = s;
int l = s * 2;
while (l <= t)
{
if (l < t&&T[l] < T[l + 1])
l += 1;
if (tmp > T[l])
break;
else
{
T[now] = T[l];
now = l;
l = l * 2;
}
}
T[now] = tmp;
}
void heap::interts(int e)//插入堆中,减堆操作也是通过该操作完成的
{
if (len != cap)
T[len + 1] = e;
else
throw"error:out of range!\n";
up(len + 1);//插入之后的向上调整
++len;
}
int heap::remove(int e)
{
int ind = get_ind(e);
if (ind == -1)
return -1;
else
{
T[ind] = T[len];
down(ind, len - 1);//删除之后的向下调整
}
--len;
return 0;
}
void heap::show()
{
for (int i = 1; i <= len; ++i)
cout << T[i] << " ";
cout << endl;
}
int main()
{
heap h(10);
int a[200] = {0};
int n;
cin >> n;
for (int i = 1; i <= n; ++i)
{
cin >> a[i];
h.interts(a[i]);
}
h.show();//以下为试验代码
h.interts(85);
h.show();
h.interts(90);
h.show();
h.remove(100);
h.show();
return 0;
}
在网上看了些代码,学着写了写
C++实现二叉堆
最新推荐文章于 2022-11-27 22:35:52 发布