#include <stdio.h>
#include <stdlib.h>
 
#define height 4
#define MAX (1<<height) 
 
int t[MAX+1]; //配列外アクセス防止のためのダミーで＋１
int sz = 0;
 
void swap(int *x, int *y){
    int tmp = *x;
    *x = *y;
    *y = tmp;
}
 
void initTree(int n){
    int i;
    for(i=0;i<MAX;i++){
        t[i] = -1;
    }
}
 
void printA(){
    int i;
    for(i=1;i<MAX;i++) printf("%d ",t[i]);
    printf("\n");
}
 
int goP(int i){
    if(i/2 == 0) return 0;
    else return i/2;
}
 
int goL(int i){
    if(2*i >= MAX) return 0;
    else return 2*i;
}
 
int goR(int i){
    if(2*i+1 >= MAX) return 0;
    else return 2*i+1;
}
 
void insBT(int x){
    int k,i = 1;
    for(k=0;k<height;k++){
        if(t[i]==-1){
            t[i] = x;
            sz++;
            return;
        }
        if(x < t[i]) i = goL(i);
        else i = goR(i);
    }
    printf("Error : too height -> %d\n",x);
}
 
void printT(int i){
    int x = i;
    while(x/2!=0){
        printf("  ");
        x/=2;
    }
    printf("%d\n",t[i]);
}
 
void preOrder(int i){
	if(t[i]==-1) return ;
	printT(i);
	preOrder(goL(i));
	preOrder(goR(i));
}
 
void inOrder(int i){
	if(t[i]==-1) return ;
	preOrder(goL(i));
	printT(i);
	preOrder(goR(i));
}
 
void postOrder(int i){
	if(t[i]==-1) return ;
	preOrder(goL(i));
	preOrder(goR(i));
	printT(i);
}
 
int main(void){
    int i,x,n;
    scanf("%d",&n);
    initTree(n);
    for(i=0;i<n;i++){
        scanf("%d",&x);
        insBT(x);
    }
    printf("== preOrder ====\n");
    preOrder(1);
    printf("\n");
    printf("== inOrder ====\n");
    inOrder(1);
    printf("\n");
    printf("== postOrder ====\n");
    postOrder(1);
    printf("\n");
    return 0;
}