-
题目描述:
-
从上往下打印出二叉树的每个节点,同层节点从左至右打印。
-
输入:
-
输入可能包含多个测试样例,输入以EOF结束。
对于每个测试案例,输入的第一行一个整数n(1<=n<=1000, :n代表将要输入的二叉树元素的个数(节点从1开始编号)。接下来一行有n个数字,代表第i个二叉树节点的元素的值。接下来有n行,每行有一个字母Ci。
Ci=’d’表示第i个节点有两子孩子,紧接着是左孩子编号和右孩子编号。
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
/*思路:根据题意建立二叉树,然后做广搜*/
#include<cstdio>
#include<queue>
#include<cstring>
#include<cstdlib>
#include<iostream>
#define MAX 1003
using namespace std ;
typedef struct node
{
int data ;
struct node *left , *right ;
}node , *tree ;
void Init(tree A[])
{
for(int i = 1 ; i < MAX ; i ++)
A[i] = NULL ;
}
queue<tree>q ;
int c[MAX] , k = 0 ;
void Print(tree T)
{
if(T){
q.push(T);
while(!q.empty()){
tree p = q.front();
c[k++] = p->data ;
if(p->left)
q.push(p->left) ;
if(p->right)
q.push(p->right);
q.pop() ;
}
}
return ;
}
int main(void)
{
int n ;
while(scanf("%d",&n)!=EOF)
{
k = 0 ;
int i ;
tree A[MAX] ;
Init(A);
for( i = 1 ; i <= n ; i ++)
{
int cnt ;
scanf("%d",&cnt);
tree p = (node *)malloc(sizeof(node)) ;
p->data = cnt ;
p->left = p->right = NULL ;
A[i] = p ;
}
char s[5] ;
int l , r ;
for( i = 1 ; i <= n ; i ++)
{
scanf("%s",s);
switch(s[0])
{
case 'd':{
scanf("%d %d",&l,&r);
A[i]->left = A[l] ;
A[i]->right = A[r] ;
break;
}
case 'l':{
scanf("%d",&l);
A[i]->left = A[l] ;
break;
}
case 'r':{
scanf("%d",&r);
A[i]->right = A[r] ;
break;
}
default : break;
}
}
Print(A[1]);
for( i = 0 ; i < k-1 ; i ++)
printf("%d ",c[i]);
printf("%d\n",c[k-1]);
}
return 0 ;
}