-
输入:
-
输入可能包含多个测试样例,输入以EOF结束。
对于每个测试案例,输入的第一行为一个整数n(0<=n<=1000,n代表将要输入的二叉树节点的个数(节点从1开始编号)。接下来一行有n个数字,代表第i个二叉树节点的元素的值。接下来有n行,每行有一个字母Ci。
Ci=’d’表示第i个节点有两子孩子,紧接着是左孩子编号和右孩子编号。
Ci=’l’表示第i个节点有一个左孩子,紧接着是左孩子的编号。
Ci=’r’表示第i个节点有一个右孩子,紧接着是右孩子的编号。
Ci=’z’表示第i个节点没有子孩子。
-
输出:
-
对应每个测试案例,
按照前序输出其孩子节点的元素值。
若为空输出NULL。
-
样例输入:
-
7 8 6 10 5 7 9 11 d 2 3 d 4 5 d 6 7 z z z z
-
样例输出:
-
8 10 11 9 6 7 5
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define MAX 1010
typedef struct node
{
int data ;
struct node *left , *right ;
}node , *tree ;
int s[MAX] , k ;
void Init(tree a[] )
{
for(int i = 1 ; i < MAX ; i ++)
a[i] = NULL ;
}
void CreateMirror(tree &root)
{
if(root==NULL)
return ;
tree p = root->left ;
root->left = root->right ;
root->right = p ;
CreateMirror(root->left);
CreateMirror(root->right);
}
void Preorder(tree T)
{
if(T)
{
s[k++] = T->data ;
Preorder(T->left);
Preorder(T->right);
}
}
void test(tree T)
{
if(T)
{
s[k++] = T->data ;
test(T->right) ;
test(T->left) ;
}
}
int main(void)
{
int n ;
while(scanf("%d",&n)!=EOF)
{
k = 0 ;
tree a[MAX] ;
Init(a);
int i ;
for( i = 1 ; i <= n ; i++)
{
int cnt ;
scanf("%d",&cnt);
tree p ;
p =(node *)malloc(sizeof(node));
p->data = cnt ;
p->left = p->right = NULL ;
a[i] = p ;
}
for( i = 1 ; i <= n ; i ++)
{
char ch[6] ;
int l , r ;
scanf("%s",ch);
switch(ch[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;
}
case 'z':{
break;
}
}
}
if(a[1]==NULL)
{
printf("NULL\n");
continue ;
}
CreateMirror(a[1]) ;
Preorder(a[1]);
//test(a[1]) ;
for( i = 0 ; i < k - 1; i ++)
printf("%d ",s[i]);
printf("%d\n",s[k-1]);
}
return 0;
}