Description
已知一棵二叉树的前序遍历和中序遍历,求二叉树的后序遍历和层序遍历。
Input
输入数据有多组,第一行是一个整数t (t<1000),代表有t组测试数据。每组包括两个长度小于50 的字符串,第一个字符串表示二叉树的先序遍历序列,第二个字符串表示二叉树的中序遍历序列。
Output
每组第一行输出二叉树的后序遍历序列,第二行输出二叉树的层次遍历序列。
Sample
Input
2 abdegcf dbgeafc xnliu lnixu
Output
dgebfca abcdefg linux xnuli
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct node{
char c;
struct node *lt, *rt;
};
char pre[50];
char in[50];
int len;
struct node *create(int len, char pre[], char in[]){
struct node *root;
if(!len){
root = NULL;
return NULL;
}
root = (struct node *)malloc(sizeof(struct node));
root -> c = pre[0];
int i;
for(i = 0; i < len; i++){
if(pre[0] == in[i]){
break;
}
}
root -> lt = create(i, pre + 1, in);
root -> rt = create(len - 1 - i, pre + 1 + i, in + 1 + i);
return root;
}
void postorder(struct node *root){
if(root){
postorder(root -> lt);
postorder(root -> rt);
printf("%c", root -> c);
}
}
void hierarchical(struct node *root){
if(root){
int in = 0, out = 0;
struct node *hie[50];
hie[in++] = root;
while(out < in){
if(hie[out]){
printf("%c", hie[out] -> c);
hie[in++] = hie[out] -> lt;
hie[in++] = hie[out] -> rt;
}
out++;
}
}
}
int main(){
int t, i;
scanf("%d", &t);
for(i = 0; i < t; i++){
struct node *root;
scanf("%s", pre);
scanf("%s", in);
len = strlen(pre);
root = create(len, pre, in);
postorder(root);
printf("\n");
hierarchical(root);
printf("\n");
}
return 0;
}