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

题目描述

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

输入

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

第一行一个正整数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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值