1020 Tree Traversals (25 分)
Suppose that all the keys in a binary tree are distinct positive integers. Given the postorder and inorder traversal sequences, you are supposed to output the level order traversal sequence of the corresponding binary tree.
Input Specification:
Each input file contains one test case. For each case, the first line gives a positive integer N (≤30), the total number of nodes in the binary tree. The second line gives the postorder sequence and the third line gives the inorder sequence. All the numbers in a line are separated by a space.
Output Specification:
For each test case, print in one line the level order traversal sequence of the corresponding binary tree. All the numbers in a line must be separated by exactly one space, and there must be no extra space at the end of the line.
Sample Input:
7
2 3 1 5 7 6 4
1 2 3 4 5 6 7
Sample Output:
4 1 6 3 5 7 2
分析
distinct positive integers 不同的正整数
binary tree 二叉树
The postorder and inorder traversal sequences
the level order traversal sequence
结构体
代码
#include<stdio.h>
#include<stdlib.h>
#define Max 30
int post[Max],ins[Max],loc=0;
struct Node{
int data;
struct Node *left,*right;
}root;
void creat(int,int,int,struct Node*);
void level();
int main(){
int N,i;
scanf("%d",&N);
for(i=0;i<N;i++) scanf("%d",&post[i]);
for(i=0;i<N;i++) scanf("%d",&ins[i]);
root.data=post[N-1];
//printf("%d\n",root.data);//delete
creat(0,0,N,&root);
level();
return 0;
}
//creat bitree√
void creat(int p, int in, int len, struct Node *rt){
int i;
for(i=0;i<len;i++) if(ins[in+i]==rt->data) break;
//printf("rt: %d, loc in ins: %d,",rt->data,in+i+1);//delete
//judge left and right subtree
if(i-1>=0){
rt->left=(struct Node*)malloc(sizeof(struct Node));
rt->left->data=post[p+i-1];
//printf(" left : %d,",rt->left->data);//delete
}else rt->left=NULL;
if(i<=len-2){
rt->right=(struct Node*)malloc(sizeof(struct Node));
rt->right->data=post[p+len-2];
//printf(" right: %d",rt->right->data);//delete
}else rt->right=NULL;
//printf("\n");//delete
//find subtree of subtree
if(i-1>=0) creat(p,in,i,rt->left);
if(i<=len-2) creat(p+i,in+i+1,len-i-1,rt->right);
}
//level order travelsal
void level(){
struct Node *queue[Max],*p;
int front=0,rear=0,i;//rear next loc
queue[rear++]=&root;
while(rear>front){
p=queue[front];
if(p->left) queue[rear++]=p->left;
if(p->right) queue[rear++]=p->right;
front++;
}
//output
printf("%d",queue[0]->data);
for(i=1;i<rear;i++) printf("% d",queue[i]->data);
}