递归部分边界条件没写好,导致大部分时间在debug上了,想法较为简单同由先序遍历和中序遍历构建的想法差不多,代码段忘记加层序遍历的内容,不过问题不大
#include <cstdio>
#include <algorithm>
#include <vector>
using namespace std;
const int maxn = 35;
struct pair0
{
int key,priority;
}Pair;
struct node
{
pair0 value;
int left = -1,right =-1;
}Node[maxn];
vector<pair0> v;
int N,index = 0;
bool cmp1(pair0 a,pair0 b) {return a.key < b.key;}
bool cmp2(pair0 a,pair0 b) {return a.priority < b.priority;}
int newNode(pair0 P)
{
Node[index].value.key = P.key;
Node[index].value.priority = P.priority;
Node[index].left = Node[index].right = -1;
return index++;
}
void create(int root,vector<pair0> vTemp,pair0 P)
{
//vTemp2 is sorted by priority
int len = vTemp.size();
if(len == 0) return;
sort(vTemp.begin(),vTemp.end(),cmp1);
root = newNode(P);
int k,keyP = P.priority;
for(k = 0;k < len; k++)
{
if(keyP == vTemp[k].priority) break;
}
vector<pair0> v1,v2;
for(int i = 0; i < k; i++) v1.push_back(vTemp[i]);
sort(v1.begin(),v1.end(),cmp2);
for(int i = k + 1;i < len;i++) v2.push_back(vTemp[i]);
sort(v2.begin(),v2.end(),cmp2);
int len1 = v1.size(),len2 = v2.size();
if(len1 != 0) create(Node[root].left,v1,v1[0]);
if(len2 != 0) create(Node[root].right,v2,v2[0]);
}
int main()
{
scanf("%d",&N);
for(int i = 0; i < N; i++)
{
scanf("%d %d",&Pair.key,&Pair.priority);
v.push_back(Pair);
}
sort(v.begin(),v.end(),cmp2);
create(0,v,v[0]);
for(int i = 0; i < index; i++)
{
if(i == 0) printf("%d",Node[i].value.key);
else printf(" %d",Node[i].value.key);
}
printf("\n");
for(int i = 0; i < index; i++)
{
if(i == 0) printf("%d",Node[i].value.priority);
else printf(" %d",Node[i].value.priority);
}
}