タイトル1523:二叉木を上から下へ印刷-九度

1943 ワード

タイトルの説明:
ツリーの各ノードを上から下に印刷し、同レイヤノードを左から右に印刷します.
入力:
入力には複数のテストサンプルが含まれ、入力は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
d 6 7
z
z
サンプル出力:
8 6 10 5 7 9 11
推奨指数:※
ソース:http://ac.jobdu.com/problem.php?pid=1523
BFS
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<vector>
#include<queue>
using namespace std;
typedef struct node{
	int val;
	int left;
	int right;
}node;
vector< node > tree;
void print_tree(int n)
{	
	if(n>0){
		queue <int> q;
		printf("%d",tree[1].val);
		if(tree[1].left!=-1)
			q.push(tree[1].left);
		if(tree[1].right!=-1)
			q.push(tree[1].right);
		while(!q.empty()){
			int tmp;
			tmp=q.front();
			printf(" %d",tree[tmp].val);
			q.pop();
			if(tree[tmp].left!=-1)
				q.push(tree[tmp].left);
			if(tree[tmp].right!=-1)
				q.push(tree[tmp].right);
		}
	}
}
int main()
{
	int n,i;
	while (scanf("%d",&n)!=EOF){
		tree.resize(n+1);
		for(i=1;i<=n;i++)
			scanf("%d",&tree[i].val);
		for(i=1;i<=n;i++){
			char ch[2];
			scanf("%s",ch);
			if('d'==ch[0])
				scanf("%d%d",&tree[i].left,&tree[i].right);
			else if('l'==ch[0]){
				scanf("%d",&tree[i].left);
				tree[i].right=-1;
			}
			else if('r'==ch[0]){
				tree[i].left=-1;
				scanf("%d",&tree[i].right);
			}
			else{
				tree[i].right=-1;
				tree[i].left=-1;
			}
		}
		print_tree(n);
	}
	return 0;
}