M04078: 实现堆结构
http://cs101.openjudge.cn/practice/04078/
要求手搓堆实现。
思路:根据课上所讲直接写即可,用时约20min
cpp
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
struct TreeNode
{
int value;
TreeNode* left;
TreeNode* right;
TreeNode(int v) : value(v), left(nullptr), right(nullptr) {}
TreeNode(int v, TreeNode* l, TreeNode* r) : value(v), left(l), right(r) {}
};
class quque//手搓最小堆
{
public:
vector<int> q;
void push(int value)
{
q.push_back(value);
int i = q.size()-1;
while (i > 0)
{
int parent = (i-1)/2;
if (q[parent] > q[i])
{
int tmp = q[parent];
q[parent] = q[i];
q[i] = tmp;
i = parent;
}
else
break;
}
}
void pop()
{
q[0] = q[q.size()-1];
q.pop_back();
int i = 0;
while (2 * i + 1 < q.size())
{
int left = 2 * i + 1;
int right = 2 * i + 2;
int min = left;
if (right < q.size() && q[right] < q[left])
min = right;
if (q[min] < q[i])
{
int tmp = q[min];
q[min] = q[i];
q[i] = tmp;
i = min;
}
else
break;
}
}
int top()
{
return q[0];
}
};
int main()
{
int n;
cin >> n;
quque q;
while (n--)
{
int type;
cin >> type;
if (type == 1)
{
int value;
cin >> value;
q.push(value);
}
else
{
cout << q.top() << endl;
q.pop();
}
}
return 0;
}