#include<iostream>
#include<cstdio>
#include<cstring>
//using namespace std;
int tree[30];
int left[30];
int right[30];
void init(){
tree[0]=1;
for(int i=1;i<20;i++){
int sum=0;
for(int j=0;j<i;j++){
sum+=tree[j]*tree[i-j-1];
}
tree[i]=sum;
}
}
int solve(int &p,int n,int m,int start,int idx){
int root,i,sum=0;
for(i=0;i<n;i++){
int t=tree[i]*tree[n-i-1]*idx;
if(m<=t) break;
m-=t;
sum+=t;
}
p=start+i;
if(i){
int t=solve(root,i,m,start,idx*tree[n-i-1]);
m-=t;
sum+=t;
left[p]=root;
}else left[p]=-1;
start+=i+1;
i=n-i-1;
if(i){
int t=solve(root,i,m,start,idx);
m-=t;
sum+=t;
right[p]=root;
}else right[p]=-1;
return sum;
}
void preorder(int t){
if(t==-1) return ;
printf("%c",t+'a');
preorder(left[t]);
preorder(right[t]);
}
void midorder(int t){
if(t==-1) return;
midorder(left[t]);
printf("%c %c %c\n",t+'a',left[t]==-1?'*':left[t]+'a',right[t]==-1?'*':right[t]+'a');
midorder(right[t]);
}
int main(){
init();
int n,m;
int tcase=0;
while(scanf("%d%d",&n,&m)!=EOF){
int root;
if(tcase++) puts("");
memset(left,-1,sizeof(left));
memset(right,-1,sizeof(right));
solve(root,n,m,0,1); //n个节点,第m个序列
preorder(root);
puts("");
midorder(root);
}
}
ZOJ 2738 The Kth BST (计算二叉排序树的个数)
最新推荐文章于 2022-03-06 15:16:31 发布