#include <stdio.h>
#include <stdlib.h>
typedef int ElementType;
typedef struct TreeNode *Tree;
typedef Tree QueueElementType;
struct TreeNode
{
ElementType Data;
Tree Left, Right;
};
int Count = 0;
ElementType *Key;
typedef struct queue *Queue;
typedef struct LinkedNode *LinkedList;
typedef LinkedList Position;
struct LinkedNode
{
Tree Data;
LinkedList Next;
};
struct queue {
LinkedList Head;
int Size;
Position Rear;
int Capacity;
};
void WriteData(Tree T);
Queue InitQueue();
int IsEmpty(Queue Q);
void EnterQueue(Tree X, Queue Q);
Tree QuitQueue(Queue Q);
int compar(const void *a, const void *b)
{
return *((int*)a) - *((int*)b);
}
int main()
{
int N;
scanf("%d",&N);
Tree T = malloc(sizeof(struct TreeNode)*N);
int Left, Right;
for (int i=0; i<N; i++) {
scanf("%d %d",&Left, &Right);
if (Left == -1) {
T[i].Left = NULL;
}else
{
T[i].Left = &T[Left];
}
if (Right == -1) {
T[i].Right = NULL;
}else
{
T[i].Right = &T[Right];
}
T[i].Data = i;
}
Key = malloc(sizeof(ElementType)*N);
for (int i=0; i<N; i++) {
scanf("%d",&Key[i]);
}
qsort(Key, N, sizeof(ElementType), compar);
WriteData(T);
Queue Q = InitQueue();
if (T) {
EnterQueue(T, Q);
}
int flag = 1;
Tree Temp = NULL;
while (!IsEmpty(Q)) {
Temp = QuitQueue(Q);
if (flag) {
printf("%d",Temp->Data);
flag = 0;
}else
{
printf(" %d",Temp->Data);
}
if (Temp->Left) {
EnterQueue(Temp->Left, Q);
}
if (Temp->Right) {
EnterQueue(Temp->Right, Q);
}
}
return 0;
}
void WriteData(Tree T)
{
if (T) {
WriteData(T->Left);
T->Data = Key[Count++];
WriteData(T->Right);
}
}
Queue InitQueue()
{
Queue Q = malloc(sizeof(struct queue));
Q->Head = malloc(sizeof(struct LinkedNode));
Q->Head->Next = NULL;
Q->Size = 0;
Q->Rear = Q->Head;
return Q;
}
int IsEmpty(Queue Q)
{
return Q->Size == 0;
}
void EnterQueue(Tree X, Queue Q)
{
Position P = malloc(sizeof(struct LinkedNode));
P->Data = X;
P->Next = NULL;
Q->Rear->Next = P;
Q->Rear = P;
Q->Size++;
}
Tree QuitQueue(Queue Q)
{
if (IsEmpty(Q)) {
return NULL;
}
Q->Size--;
Position DeleteNode = Q->Head->Next;
Q->Head->Next = Q->Head->Next->Next;
if (Q->Head->Next == NULL) {
Q->Head = Q->Rear;
}
return DeleteNode->Data;
}