Hello大家好!很高兴我们又见面啦!给生活添点passion,开始今天的编程之路!
我的博客:<但凡.
我的专栏:《编程之路》、《数据结构与算法之美》、《题海拾贝》
欢迎点赞,关注!
1、题目
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();
}
}
}
好了,今天的内容就分享到这,我们下期再见!