【Tsinghua】树重建(Rebuild)
这道题就是各种顺序的遍历一棵树。。。
树重建(Rebuild)
描述
某二叉树的n个节点已经用[1, n]内的整数进行了编号。现给定该二叉树的中序遍历序列和后序遍历序列,试输出其对应的先序遍历序列。

输入
第一行为一个整数n。
第二、三行,即已知的中序、后序遍历序列。
输出
仅一行。
若所给的中序、后序遍历序列的确对应于某棵二叉树,则输出其先序遍历序列。否则,输出-1。
输入样例1
5
4 2 5 1 3
4 5 2 3 1
输出样例1
1 2 4 5 3
输入样例2
3
2 3 1
1 2 3
输出样例2
-1
限制
1 ≤ n ≤ 5000
时间:2 sec
空间:256MB
输入和输出的遍历序列均为[1, n]内整数的一个排列,整数间均以空格分隔,行末没有多余空格。
提示
不同遍历序列中根节点的位置。
AC的代码:
#include <stdio.h>
#include <stdlib.h>
#define MAXN 5005
int in[MAXN]; //中序
int af[MAXN]; //后序
int ans[MAXN]; //最后输出的前序序列
int count=0;
struct TreeNode
{
struct TreeNode* left;
struct TreeNode* right;
int elem;
};
TreeNode* BinTree(int inorder[], int aftorder[], int length)
{
if(length == 0)
{
return NULL;
}
TreeNode* node = new TreeNode; //新建一个树节点
node->elem = *(aftorder+length-1);
ans[count++]=node->elem; //存入答案
int rootIndex=0;
for( ;rootIndex<length;rootIndex++) //在中序遍历中找这个根节点
{
if(inorder[rootIndex]==*(aftorder+length-1))
break;
}
if(rootIndex>=length)
{
printf("-1\n");
exit(0);
}
node->left = BinTree(inorder,aftorder,rootIndex);
node->right = BinTree(inorder+rootIndex+1 , aftorder+rootIndex , length-(rootIndex+1));
return node;
}
int main()
{
int n;
scanf("%d",&n);
int i;
for(i=0;i<n;i++)
scanf("%d",&in[i]);
for(i=0;i<n;i++)
scanf("%d",&af[i]);
BinTree(in,af,n);
for(i=0;i<count-1;i++)
printf("%d ",ans[i]);
printf("%d\n",ans[i]);
return 0;
}
最后更新:2017-04-03 05:39:38
上一篇:
Firefox无法同步问题的解决
下一篇:
UILabel设置多种字体、颜色
VMware的“Intel VT-x is disabled”解决方法
确定不收藏?十张机器学习和深度学习工程师必备速查表!
Android开发6——布局中的wrap_content和fill_parent以及match_parent
Oracle中序列的操作以及使用前对序列的初始化
CUDA从入门到精通(三):必备资料
《Linux From Scratch》第二部分:准备构建 第五章:构建临时文件系统- 5.29. Perl-5.20.2
动态规划-循环数组的最大子数组和
C# WinForm中PreviewKeyDown、KeyDown、KeyPress、KeyUp区别与联系
C# 文件,文件夹的操作
.NET中IO体系结构