题意:给一个序列,建一棵二叉搜索树,然后求一个序列,使得按新序列建树,树的形状和原先的一样,且字典序最小。
思路:就按给的序列建树。然后先序遍历输出,这样字典序一定是最小的。因为对每个子树来说,根需要先建立,且左孩子的字典序小于右孩子的字典序。
#include <iostream>
#include <stdio.h>
#include <cmath>
#include <algorithm>
#include <iomanip>
#include <cstdlib>
#include <string>
#include <memory.h>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <ctype.h>
#define ll long long
#define max3(a,b,c) max(a,max(b,c))
#define MAXN 4100000
using namespace std;
int num[100010];
int l[100010];
int r[100010];
void print(int x){
if(x==-1)return;
if(x!=1)printf(" ");
printf("%d",num[x]);
print(l[x]);
print(r[x]);
}
int main(){
int n;
while(cin>>n){
memset(l,-1,sizeof(l));
memset(r,-1,sizeof(r));
for(int i=1;i<=n;i++){
scanf("%d",&num[i]);
}
for(int i=2;i<=n;i++){
int p=1;
while(1){
if(num[i]<num[p]){
if(l[p]==-1){
l[p]=i;
break;
}
p=l[p];
}else{
if(r[p]==-1){
r[p]=i;
break;
}
p=r[p];
}
}
}
print(1);
printf("\n");
}
return 0;
}