题目链接
题意:。。。自己看
题解:当前插入的最后一个点肯定满足:
1.一定是极左节点,就是从根一直往左走可以走到的,因为总是插入在左子树中。
2.一定没有右儿子,显然。
而当同时有多个点满足条件时,应选深度最小的点,若深度最小的点先选,当插入深度更大的点是,他会只有右子树而无左子树,这显然不可能。
注意若深度第二小的是叶子,因为要字典序最小,应先选叶子。
#include<bits/stdc++.h>
using namespace std;
int N,Root=1;
int LC[105],RC[105],Fa[105];
int Ans[105];
bool Check(int x){
return !LC[x]&&!RC[x];
}
void Remove(int x){
if(x==Root)
Root=LC[x];
LC[Fa[x]]=LC[x];
Fa[LC[x]]=Fa[x];
int i;
for(i=Fa[x];i;i=Fa[i])
swap(LC[i],RC[i]);
}
int main(){
freopen("1078.in","r",stdin);
freopen("1078.out","w",stdout);
int i,j,x;
scanf("%d",&N);
for(i=2;i<=N+1;i++){
scanf("%d",&x);
if(x<100)
LC[x+1]=i,Fa[i]=x+1;
else RC[x-100+1]=i,Fa[i]=x-100+1;
}
for(i=0;i<=N;i++){
for(j=Root;RC[j];j=LC[j]);
if(LC[j]&&Check(LC[j]))
Ans[N-i]=LC[j],Remove(LC[j]);
else Ans[N-i]=j,Remove(j);
}
for(i=0;i<=N;i++)
printf("%d ",Ans[i]-1);
return 0;
}