1020 Tree Traversals (25 分)C语言——中序后序求层次遍历

 

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);
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值