C++实现二叉堆

#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;
}
在网上看了些代码,学着写了写
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值