题目描述:
样例:
算法思路:
每次处理一个区间,先将该区间中最小值获得到(可以使用RMQ跳表对区间预处理一下,因为这里数据范围小,我选择直接用优先队列),将其设置为当前区间的根节点(满足了堆的特性),然后递归处理左右子树,注意一下数列中数据范围是int,所以左右儿子的值不能用数组直接存,需要先对序列的值进行离散化。我这里为了省事,就直接选择了unordered_map。
C++ 代码:
#include <iostream>
#include <cstring>
#include <unordered_map>
#include <queue>
using namespace std;
const int N = 40;
int n, in[N], q[N], hh, tt = -1;
unordered_map<int, int> pos, l, r;
int build(int il, int ir)
{
priority_queue<int, vector<int>, greater<int>> heap;
for (int i = il; i <= ir; i++) heap.push(in[i]);
int root = heap.top();
while (!heap.empty()) heap.pop();
int k = pos[root];
if (il < k) l[root] = build(il, k - 1);
if (k < ir) r[root] = build(k + 1, ir);
return root;
}
void bfs(int root)
{
q[++tt] = root;
while (hh <= tt)
{
int t = q[hh++];
if (l.count(t)) q[++tt] = l[t];
if (r.count(t)) q[++tt] = r[t];
}
cout << q[0];
for (int i = 1; i <= tt; i++) cout << ' ' << q[i];
puts("");
}
int main()
{
cin >> n;
for (int i = 0; i < n; i++) cin >> in[i], pos[in[i]] = i;
int root = build(0, n - 1);
bfs(root);
return 0;
}