Bootstrap

题海拾贝:【模版】堆

         Hello大家好!很高兴我们又见面啦!给生活添点passion,开始今天的编程之路!

91bfeb2bb1414a2ebf09cbc4f9706779.gif

我的博客:<但凡.

我的专栏:《编程之路》《数据结构与算法之美》《题海拾贝》

欢迎点赞,关注!

1、题目

f50d30b7474a4b9f87ee5e96bbea920d.png 

2、题解

       堆就是一种特殊的二叉树,根据二叉树的性质,我们进行插入和删除操作。但需要注意的关键点是,插入操作和向上调整配套使用,删除操作和向下调整配套使用。咱们的目的只是做题,不是基础知识讲解,所以说我在这只是放一下题解,至于堆的基础知识讲解我放到后面再说。

#include<iostream>
using namespace std;
const int N = 1e6 + 10;
int heap[N];
int n;
//堆是一种特殊的完全二叉树。符合二叉树的性质
void up(int child)
{
	int parent = child / 2;
	while (parent >= 1 && heap[child] < heap[parent])
	{
		swap(heap[child], heap[parent]);
		child = parent;
		parent = child / 2;
	}
}
void down(int parent)
{
	int child = parent * 2;
	while (child<=n)
	{
		if (heap[child+1] < heap[child] && child + 1 <= n) child++;
		if (heap[child] >= heap[parent]) return;//最小的都大于parent所以满足小根堆
		swap(heap[child], heap[parent]);
		parent = child;
		child = parent * 2;
	}
}
void push(int x)
{
	n++;
	heap[n] = x;
	up(n);
}
void pop()
{
	swap(heap[1], heap[n]);
	n--;
	down(1);
}
int main()
{
	int T;int op;int x;
	cin >> T;
	while (T--)
	{
		cin >> op;
		if (op == 1)
		{
			cin >> x;
			push(x);
		}
		else if (op == 2)
		{
			cout << heap[1]<<endl;
		}
		else
		{
			pop();
		}
	}
}

       好了,今天的内容就分享到这,我们下期再见!

 

;