4-1-1 二叉树及其遍历 树的遍历 (25 分)

给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列。这里假设键值都是互不相等的正整数。

输入格式:

输入第一行给出一个正整数N(≤30),是二叉树中结点的个数。第二行给出其后序遍历序列。第三行给出其中序遍历序列。数字间以空格分隔。

输出格式:

在一行中输出该树的层序遍历的序列。数字间以1个空格分隔,行首尾不得有多余空格。

输入样例:

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

输出样例:

4 1 6 3 5 7 2

 

#include <stdio.h>
#include <stdlib.h>

typedef int ElementType;
typedef struct TNode *Position;
typedef Position BinTree;
struct TNode{
    ElementType Data;
    BinTree Left;
    BinTree Right;
};
int post[30],in[30];

BinTree Build(int head1,int tail1,int head2,int tail2);
void LevelorderTraversal( BinTree BT );
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",&in[i]);
	}
	BinTree BT=Build(0,n-1,0,n-1);
	LevelorderTraversal(BT);
	
    return 0;
}
BinTree Build(int head1,int tail1,int head2,int tail2){
	int num=post[tail1];//找到根结点
	int i;
	
	for(i=head2;i<=tail2;i++){//在中序找到根结点 
		if(num==in[i]){
			break;
		}
	}
	BinTree T=(BinTree)malloc(sizeof(struct TNode)) ;
	T->Data=num;
	int left,right;
	left=i-head2;right=tail2-i;//左右子树结点个数 
	if(left==0) T->Left=NULL;
	else
	T->Left=Build(head1,head1+left-1,head2,head2+left-1);
	if(right==0) T->Right=NULL;
	else
	T->Right=Build(i,tail1-1,i+1,tail2);
	return T;
}
void LevelorderTraversal( BinTree BT ){
	 if(!BT) return ;
	BinTree T[100];
	BinTree t;
	int rear=0,front=0;
	T[rear++]=BT;
	int flag=0;
	while(rear!=front){
		t=T[front++];
		if(flag){
			printf(" ");
		}
		printf("%d",t->Data);
		flag=1;
		if(t->Left) T[rear++]=t->Left;
		if(t->Right) T[rear++]=t->Right;
	}
}
测试点提示结果分数耗时内存
0sample等价

答案正确

152 ms324 KB
1单个结点

答案正确

12 ms196 KB
2左偏

答案正确

22 ms368 KB
3右偏

答案正确

22 ms324 KB
4左右单边交错

答案正确

22 ms196 KB
5最大规模

段错误

012 ms11724 KB

 

这个也不知道是哪里段错误了

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值