#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++实现二叉堆
猜你喜欢
转载自blog.csdn.net/chczy1/article/details/78446120
今日推荐
周排行