您的位置:首页 > 其它

浙大模拟(1)问题 C: 还原二叉树

2017-03-12 12:04 169 查看

题目描述

给一棵二叉树的层序遍历序列和中序遍历序列,求这棵二叉树的先序遍历序列和后序遍历序列。

输入

每个输入文件中一组数据。

第一行一个正整数N(1<=N<=30),代表二叉树的结点个数(结点编号为1~N)。接下来两行,每行N个正整数,分别代表二叉树的层序遍历序列和中序遍历序列。数据保证序列中1~N的每个数出现且只出现一次。

输出

输出两行,每行N个正整数,分别代表二叉树的先序遍历序列和后序遍历序列。每行末尾不输出额外的空格。

样例输入

7
3 5 4 2 6 7 1
2 5 3 6 4 7 1

样例输出

3 5 2 4 6 7 1
2 5 6 1 7 4 3
#include<stdio.h>
#include<stdlib.h>
using namespace std;

int post[32];
int level[32];
int pre[32];
int in[32];
int n;
typedef struct BiTNode{
int key;
struct BiTNode *lchild;
struct BiTNode *rchild;
}BiTNode,*BiTree;

BiTree creatTree(BiTree &T,int l,int r){
if(l>r) return NULL;
int mid;
bool flag = false;
for(int i=1;i<=n;i++ ){
if(flag == false){
for(int j=l;j<=r;j++){
if(level[i]==in[j]){
mid = j;
flag=true;
break;
}
}
}
}

T = (BiTree)malloc(sizeof(BiTNode));
T->key = in[mid];
//	printf("mid=%d\n",mid);
T->lchild = creatTree(T->lchild,l,mid-1);
T->rchild = creatTree(T->rchild,mid+1,r);
return T;
}
int flag;
void preOrder(BiTree T){
if(T){
if(flag == false){
printf("%d",T->key);
flag = true;
}
else{
printf(" %d",T->key);
}
preOrder(T->lchild);
preOrder(T->rchild);
}
}

void postOrder(BiTree T){
if(T){
postOrder(T->lchild);
postOrder(T->rchild);
if(flag == false){
printf("%d",T->key);
flag = true;
}
else{
printf(" %d",T->key);
}
}
}

int main(){
while(scanf("%d",&n)!=EOF){
for(int i=1;i<=n;i++){
scanf("%d",&level[i]);
}
for(int i=1;i<=n;i++){
scanf("%d",&in[i]);
}
BiTree T ;
T = creatTree(T,1,n);
flag = false;
preOrder(T);
printf("\n");
flag = false;
postOrder(T);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: