完全二叉搜索树
左子树<根节点<右子树
n个点 建立完全二叉树
中序建树可以满足条件
#include<bits/stdc++.h>
using namespace std;
map<int,int>mp;
int n;int t[10000];
int tree[10000];int cnt;
void build(int root){
if(root>n) return ;
build(root<<1);
tree[root]=t[++cnt];
build(root<<1|1);
}
int main(){
cin>>n;
for(int i=1;i<=n;i++) cin>>t[i];
sort(t+1,t+1+n);
build(1);
for(int i=1;i<=n;i++) cout<<tree[i]<<" " ;
return 0;
}
浅用一下欧拉
#include<bits/stdc++.h>
using namespace std;
map<int,int>mp;
const int maxn=1e5;
bool number[maxn + 5];
int n,m;
int dis[1000000];
int pos[1000000];
void isprime() {
int prime[maxn + 5];
int i, j, c = 0;
memset(number, true, sizeof(number));
number[1]=false;
for (i = 2; i <= maxn; i++) {
if (number[i])
prime[c++] = i;
for (j = 0; j < c && prime[j] * i <= maxn; j++) {
number[prime[j] * i] = false;
if (i % prime[j] == 0)
break;
}
}
}
int main(){
isprime();
cin>>n>>m;
while(!number[n]) n++;
//cout<<n<<endl;
for(int i=0;i<m;i++){
int x; cin>>x;
int key=x%n;
int tp=key;
for(int j=0;j<n;j++){
key=tp+j*j;
if(!dis[key%n]) {
dis[key%n]=1;
pos[i]=key%n;
break;
}
if(j==n-1) pos[i]=-1;
}
}
for(int i=0;i<m;i++){
if(pos[i]==-1) cout<<"-"<<" ";
else cout<<pos[i]<<" ";
}
return 0;
}