#include<stdio.h>
struct tree
{
int weight;
int left;
int right;
int parent;
};
int search(int a,int b,struct tree paixu[]) //查找要插入的结点的父节点是哪个
{
if(a>paixu[b].weight)
{
if(paixu[b].right==-1)
return b;
else {
b=search(a,paixu[b].right,paixu);
return b;
}
}
if(a<=paixu[b].weight)
{
if(paixu[b].left==-1)
return b;
else {
b=search(a,paixu[b].left,paixu);
return b;
}
}
return 0;
}
void insert(int c,int d,struct tree paixu[]) //将节点插入到查找到的节点的左或右
{
if(paixu[c].weight>paixu[d].weight)
{
paixu[d].right=c;
paixu[c].parent=d;
}
else
{
paixu[d].left=c;
paixu[c].parent=d;
}
}
void qianxu(int k,struct tree paixu[]) //前序遍历
{
if(k!=-1)
{
int j,flag=0;
for(j=0;j<k;j++){ //已输出的权值不重复输出。
if(paixu[k].weight==paixu[j].weight){
flag=1;
}
}
if(flag!=1){
printf("%d ",paixu[k].weight);
}
qianxu(paixu[k].left,paixu);
qianxu(paixu[k].right,paixu);
}
}
void zhongxu(int k,struct tree paixu[]) //中序遍历
{
if(k!=-1)
{
zhongxu(paixu[k].left,paixu);
int j,flag=0;
for(j=0;j<k;j++){
if(paixu[k].weight==paixu[j].weight){
flag=1;
}
}
if(flag!=1){
printf("%d ",paixu[k].weight);
}
zhongxu(paixu[k].right,paixu);
}
}
void houxu(int k,struct tree paixu[]) //后序遍历
{
if(k!=-1)
{
houxu(paixu[k].left,paixu);
houxu(paixu[k].right,paixu);
int j,flag=0;
for(j=0;j<k;j++){
if(paixu[k].weight==paixu[j].weight){
flag=1;
}
}
if(flag!=1){
printf("%d ",paixu[k].weight);
}
}
}
void print(struct tree paixu[]){
qianxu(0,paixu);
printf("\n");
zhongxu(0,paixu);
printf("\n");
houxu(0,paixu);
printf("\n");
}
int main(){
int x,n;
while(scanf("%d",&n)!=EOF){
int nums[n];
for(int i=0;i<n;i++){
nums[i]=-1;
}
struct tree paixu[n];
scanf("%d",&paixu[0].weight);
paixu[0].left=-1;
paixu[0].right=-1;
paixu[0].parent=-1;
for(int i=1;i<n;i++) //插入除根节点外的后续节点
{
scanf("%d",&paixu[i].weight);
paixu[i].left=-1;
paixu[i].right=-1;
x=search(paixu[i].weight,0,paixu);
insert(i,x,paixu);
}
print(paixu);
}
return 0;
}
struct tree
{
int weight;
int left;
int right;
int parent;
};
int search(int a,int b,struct tree paixu[]) //查找要插入的结点的父节点是哪个
{
if(a>paixu[b].weight)
{
if(paixu[b].right==-1)
return b;
else {
b=search(a,paixu[b].right,paixu);
return b;
}
}
if(a<=paixu[b].weight)
{
if(paixu[b].left==-1)
return b;
else {
b=search(a,paixu[b].left,paixu);
return b;
}
}
return 0;
}
void insert(int c,int d,struct tree paixu[]) //将节点插入到查找到的节点的左或右
{
if(paixu[c].weight>paixu[d].weight)
{
paixu[d].right=c;
paixu[c].parent=d;
}
else
{
paixu[d].left=c;
paixu[c].parent=d;
}
}
void qianxu(int k,struct tree paixu[]) //前序遍历
{
if(k!=-1)
{
int j,flag=0;
for(j=0;j<k;j++){ //已输出的权值不重复输出。
if(paixu[k].weight==paixu[j].weight){
flag=1;
}
}
if(flag!=1){
printf("%d ",paixu[k].weight);
}
qianxu(paixu[k].left,paixu);
qianxu(paixu[k].right,paixu);
}
}
void zhongxu(int k,struct tree paixu[]) //中序遍历
{
if(k!=-1)
{
zhongxu(paixu[k].left,paixu);
int j,flag=0;
for(j=0;j<k;j++){
if(paixu[k].weight==paixu[j].weight){
flag=1;
}
}
if(flag!=1){
printf("%d ",paixu[k].weight);
}
zhongxu(paixu[k].right,paixu);
}
}
void houxu(int k,struct tree paixu[]) //后序遍历
{
if(k!=-1)
{
houxu(paixu[k].left,paixu);
houxu(paixu[k].right,paixu);
int j,flag=0;
for(j=0;j<k;j++){
if(paixu[k].weight==paixu[j].weight){
flag=1;
}
}
if(flag!=1){
printf("%d ",paixu[k].weight);
}
}
}
void print(struct tree paixu[]){
qianxu(0,paixu);
printf("\n");
zhongxu(0,paixu);
printf("\n");
houxu(0,paixu);
printf("\n");
}
int main(){
int x,n;
while(scanf("%d",&n)!=EOF){
int nums[n];
for(int i=0;i<n;i++){
nums[i]=-1;
}
struct tree paixu[n];
scanf("%d",&paixu[0].weight);
paixu[0].left=-1;
paixu[0].right=-1;
paixu[0].parent=-1;
for(int i=1;i<n;i++) //插入除根节点外的后续节点
{
scanf("%d",&paixu[i].weight);
paixu[i].left=-1;
paixu[i].right=-1;
x=search(paixu[i].weight,0,paixu);
insert(i,x,paixu);
}
print(paixu);
}
return 0;
}