タイトル1523:ツリーを上から下へ印刷
6703 ワード
タイトル説明:ツリーの各ノードを上から下に印刷し、同層ノードを左から右に印刷します.入力:入力には複数のテストサンプルが含まれ、入力はEOFで終了します.各テストケースについて、入力する最初の行の整数n(1<=n<=1000、:nは入力するツリー要素の個数(ノード1から番号付け)を表します.次の行には、i番目のツリーノードの要素の値を表すn個の数字があります.次はn行で、各行に1文字Ciがあります.Ci=’d’は,i番目のノードに2人の子があり,次いで左の子番号と右の子番号であることを示す.Ci=’l’は、i番目のノードに左の子があり、左の子の番号が続くことを示す.Ci=’r’は、i番目のノードに右の子があり、右の子の番号が続くことを示す.Ci=’z’はi番目のノードに子供がいないことを示す.出力:各テストケースに対応して、ツリーノードの値を上下に左から右に印刷します.サンプル入力:7 8 6 5 7 10 9 11 d 2 5 d 3 4 z z z d 6 7 zサンプル出力:8 6 10 5 7 11
import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.StreamTokenizer;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
public class Main {
public static void main(String[] args) throws IOException {
PrintWriter cout = new PrintWriter(System.out) ;
while(Cin.hashNext()){
new Task().solve(Cin.Int() , cout) ;
}
cout.flush() ;
}
}
class Task{
Node[] node ;
int[] id ;
void solve(int n , PrintWriter cout) throws IOException{
node = new Node[n+1] ;
id = new int[n+1] ;
for(int i = 1 ; i <= n ; i++){
id[i] = Cin.nextInt() ;
node[i] = new Node() ;
}
int u , v ;
for(int i = 1 ; i <= n ; i++){
String s = Cin.nextString() ;
if(s.equals("d")){
u = Cin.nextInt() ;
v = Cin.nextInt() ;
node[i].left = u ;
node[i].right = v ;
node[u].father = node[v].father = i ;
}
else if(s.equals("l")){
u = Cin.nextInt() ;
node[i].left = u ;
node[u].father = i ;
}
else if(s.equals("r")){
v = Cin.nextInt() ;
node[i].right = v ;
node[v].father = i ;
}
}
int root = -1 ;
for(int i = 1 ; i <= n ; i++){
if(node[i].father == -1) root = i ;
}
List<Integer> answer = new ArrayList<Integer>() ;
Queue<Integer> que = new LinkedList<Integer>() ;
que.add(root) ;
while(! que.isEmpty()){
u = que.poll() ;
answer.add(u) ;
if(node[u].left != -1) que.add(node[u].left) ;
if(node[u].right != -1) que.add(node[u].right) ;
}
cout.print(id[answer.get(0)]) ;
for(int i = 1 ; i < answer.size() ; i++) cout.print(" " + id[answer.get(i)] ) ;
cout.println() ;
}
}
class Node{
int father ;
int left , right ;
Node(){
father = -1 ;
left = right = -1 ;
}
}
class Cin{
static StreamTokenizer cin = new StreamTokenizer(new BufferedInputStream(System.in)) ;
static boolean hashNext() throws IOException{
return cin.nextToken() != cin.TT_EOF ;
}
static int nextInt() throws IOException{
cin.nextToken() ;
return (int)cin.nval ;
}
static int Int() throws IOException{
return (int)cin.nval ;
}
static String nextString() throws IOException{
cin.nextToken() ;
return (String)cin.sval ;
}
}