#include <cstdio>
#include <queue>
#include <iostream>
using namespace std;
struct treenode
{
int lchild;
int rchild;
char val;
treenode ( )
{
lchild = rchild = - 1 ;
}
treenode ( char x)
{
val = x;
lchild = rchild = - 1 ;
}
} ;
void leverorder ( int root, treenode a[ 200 ] )
{
if ( ( a[ root] . lchild== - 1 ) && ( a[ root] . rchild== - 1 ) )
return ;
else
{
queue< treenode> q;
q. push ( a[ root] ) ;
while ( ! q. empty ( ) )
{
cout << a[ root] . val << endl;
q. pop ( ) ;
if ( a[ root] . lchild != 0 )
q. push ( a[ a[ root] . lchild] ) ;
if ( a[ root] . rchild != 0 )
q. push ( a[ a[ root] . rchild] ) ;
}
}
}
treenode a[ 200 ] ;
int indepth[ 200 ] = { 0 } ;
int main ( )
{
int n;
scanf ( "%d" , & n) ;
int l, r;
char val;
for ( int i = 1 ; i <= n; i++ )
{
getchar ( ) ;
scanf ( "%c %d %d" , & val, & l, & r) ;
a[ i] . lchild = l;
if ( l != - 1 )
indepth[ l] ++ ;
a[ i] . rchild = r;
if ( r != - 1 )
indepth[ r] ++ ;
a[ i] . val = val;
}
int root = - 1 ;
for ( int i = 1 ; i <= n; i++ )
{
if ( ! indepth[ i] )
{
root = i;
break ;
}
}
leverorder ( root, a) ;
}
#include <cstdio>
#include <vector>
using namespace std;
struct treenode
{
int parent;
char val;
vector< int > child;
treenode ( )
{
parent = - 1 ;
}
treenode ( char x)
{
val = x;
parent = - 1 ;
}
} ;
treenode a[ 200 ] ;
int main ( )
{
int n;
scanf ( "%d" , & n) ;
int parent;
char val;
for ( int i = 1 ; i <= n; i++ )
{
scanf ( "%d" , & parent) ;
getchar ( ) ;
scanf ( "%c" , & val) ;
a[ parent] . child. push_back ( i) ;
a[ i] . val= val;
}
for ( int i = 1 ; i <= n; i++ )
{
for ( int j= 0 ; j< a[ i] . child. size ( ) ; j++ )
{
printf ( "%c " , a[ a[ i] . child[ j] ] . val) ;
}
printf ( "\n" ) ;
}
}