#include<bits/stdc++.h>
using namespace std;
#define index indexx
struct node{int data,l,r;}Node[105];
int index,n,k;
int newnode(int x){
Node[index].l=-1;Node[index].r=-1;Node[index].data=x;
return index++;//******先返回index的值 index再自加1
}
void insert(int &root,int x) {//必须使用引用符 root的
if(root==-1){
root=newnode(x);//root的地址是Node[root].l或Node[root].r,这样就能把树接起来
return;//设置返回条件
}
if(x<Node[root].data) insert(Node[root].l,x);
else insert(Node[root].r,x);
}
void preorder(int root){
if(root==-1)return;
cout<<Node[root].data<<' ';
preorder(Node[root].l);
preorder(Node[root].r);
}
void inorder(int root){
if(root==-1)return;
inorder(Node[root].l);
cout<<Node[root].data<<' ';
inorder(Node[root].r);
}
void postorder(int root){
if(root==-1)return;
postorder(Node[root].l);
postorder(Node[root].r);
cout<<Node[root].data<<' ';
}
int main(){
bool b[100000];
while(cin>>n){//循环输入
index=0;//每次进来都要初始化
memset(b,false,sizeof(b));//标记重复
int root=-1;
for(int i=0;i<n;i++){
cin>>k;
if(b[k]==false){
b[k]=true;//标记
insert(root,k);
}//建立二叉排序树
}
preorder(0);cout<<endl;
inorder(0);cout<<endl;
postorder(0);cout<<endl;//三种遍历输出
for(int i=0;i<=index;i++) Node[i].data=Node[i].l=Node[i].r=-1;//初始化
}
return 0;
}