剑指Offer - 九度1385 - 重建二叉树
剑指Offer - 九度1385 - 重建二叉树
2013-11-23 23:53
- 题目描述:
-
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并输出它的后序遍历序列。
- 输入:
-
输入可能包含多个测试样例,对于每个测试案例,
输入的第一行为一个整数n(1<=n<=1000):代表二叉树的节点个数。
输入的第二行包括n个整数(其中每个元素a的范围为(1<=a<=1000)):代表二叉树的前序遍历序列。
输入的第三行包括n个整数(其中每个元素a的范围为(1<=a<=1000)):代表二叉树的中序遍历序列。
- 输出:
-
对应每个测试案例,输出一行:
如果题目中所给的前序和中序遍历序列能构成一棵二叉树,则输出n个整数,代表二叉树的后序遍历序列,每个元素后面都有空格。
如果题目中所给的前序和中序遍历序列不能构成一棵二叉树,则输出”No”。
- 样例输入:
-
8
1 2 4 7 3 5 6 8
4 7 2 1 5 3 8 6
8
1 2 4 7 3 5 6 8
4 1 2 7 5 3 8 6
- 样例输出:
-
7 4 2 5 8 6 3 1
No
题意分析:
给定一棵二叉树的前序遍历和中序遍历,计算出对应的后序遍历。如果给定的数据不是有效的遍历,则输出“No”。
前序遍历:根-左子树-右子树
中序遍历:左子树-根-右子树
后序遍历:左子树-右子树-根
因此,前序遍历的第一个节点为根节点,根据根节点的值在中序遍历中找到其对应位置,左边是左子树,右边是右子树,然后左右递归求解即可。
需要注意的是:输出后序遍历时,根节点最后输出,所以递归求解时,也应该在左右子树递归完成之后才处理根节点。
由于每次找出在中序遍历中找根节点的位置需要O(n)的查找时间,O(1)处理根节点,于是有T(n) = 2 * T(n / 2) + O(n) + O(1),推导下复杂度:
T(n) = 2 * T(n / 2) + O(1) + O(n)
T(n) = 2 * T(n / 2) + O(n)
T(n) = 4 * T(n / 4) + 2 * (O(n / 2)) + O(n)
T(n) = 4 * T(n / 4) + 2 * O(n)
T(n) = 2 ^ log(n) * T(1) + log(n) * O(n)
T(n) = O(n) + O(n * log(n))
T(n) = O(n * log(n))
递归求解,因为每个节点都会被递归到,所以空间复杂度为O(n)。
// 651379 zhuli19901106 1385 Accepted 点击此处查看所有case的执行结果 1024KB 1256B 0MS
//
#include <cstdio>
#include <vector>
using namespace std; void construct_tree(vector<int> &a, vector<int> &b, vector<int> &c, int l1, int r1, int l2, int r2)
{
if(l1 > r1 || l2 > r2){
return;
} if(r1 - l1 != r2 - l2){
return;
} int mid;
int nl, nr; for(mid = l2; mid <= r2; ++mid){
if(b[mid] == a[l1]){
nl = mid - l2;
nr = r2 - mid;
if(nl > ){
construct_tree(a, b, c, l1 + , l1 + nl, l2, mid - );
}
if(nr > ){
construct_tree(a, b, c, r1 - nr + , r1, mid + , r2);
}
c.push_back(a[l1]);
return;
}
} } int main()
{
vector<int> a, b, c;
int n;
int tmp;
int i; while(scanf("%d", &n) == ){
for(i = ; i < n; ++i){
scanf("%d", &tmp);
a.push_back(tmp);
}
for(i = ; i < n; ++i){
scanf("%d", &tmp);
b.push_back(tmp);
}
c.clear();
construct_tree(a, b, c, , n - , , n - );
a.clear();
b.clear();
if(c.size() < n){
printf("No\n");
}else{
for(i = ; i < n; ++i){
printf("%d ", c[i]);
}
printf("\n");
}
c.clear();
} return ;
}
剑指Offer - 九度1385 - 重建二叉树的更多相关文章
- 剑指Offer - 九度1523 - 从上往下打印二叉树
剑指Offer - 九度1523 - 从上往下打印二叉树2013-12-01 00:35 题目描述: 从上往下打印出二叉树的每个节点,同层节点从左至右打印. 输入: 输入可能包含多个测试样例,输入以E ...
- 剑指Offer - 九度1521 - 二叉树的镜像
剑指Offer - 九度1521 - 二叉树的镜像2013-11-30 23:32 题目描述: 输入一个二叉树,输出其镜像. 输入: 输入可能包含多个测试样例,输入以EOF结束.对于每个测试案例,输入 ...
- 剑指Offer - 九度1368 - 二叉树中和为某一值的路径
剑指Offer - 九度1368 - 二叉树中和为某一值的路径2013-11-23 03:46 题目描述: 输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.路径定义为从树的根结 ...
- 剑指Offer - 九度1350 - 二叉树的深度
剑指Offer - 九度1350 - 二叉树的深度2013-11-23 00:54 题目描述: 输入一棵二叉树,求该树的深度.从根结点到叶结点依次经过的结点(含根.叶结点)形成树的一条路径,最长路径的 ...
- 剑指Offer - 九度1524 - 复杂链表的复制
剑指Offer - 九度1524 - 复杂链表的复制2014-02-07 01:30 题目描述: 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点 ...
- 剑指Offer - 九度1509 - 树中两个结点的最低公共祖先
剑指Offer - 九度1509 - 树中两个结点的最低公共祖先2014-02-07 01:04 题目描述: 给定一棵树,同时给出树中的两个结点,求它们的最低公共祖先. 输入: 输入可能包含多个测试样 ...
- 剑指Offer - 九度1520 - 树的子结构
剑指Offer - 九度1520 - 树的子结构2013-11-30 22:17 题目描述: 输入两颗二叉树A,B,判断B是不是A的子结构. 输入: 输入可能包含多个测试样例,输入以EOF结束.对于每 ...
- 剑指Offer - 九度1508 - 把字符串转换成整数
剑指Offer - 九度1508 - 把字符串转换成整数2014-02-06 23:46 题目描述: 将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数. 输入: 输入可能包含多个测试样例 ...
- 剑指Offer - 九度1504 - 把数组排成最小的数
剑指Offer - 九度1504 - 把数组排成最小的数2014-02-06 00:19 题目描述: 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个.例如输 ...
随机推荐
- 整理齐全 - Vultr VPS自定义安装Windows ISO(2003/2012/2008/WIN7)
最近公司有几个项目是需要在Windows VPS服务器中运行调试的,但是公司给予的成本有限,所以只能在Linux VPS中考虑,毕竟Linux服务器相比Windows系统便宜很多.开始我们运维部门考虑 ...
- Linux终端(terminal)清屏命令
windows CMD终端的清屏命令是cls Linux终端中的清屏命令有 1) clear 2) reset
- IOS 多线程-pthread
#import <pthread.h> @interface HMViewController () - (IBAction)btnClick; @end @implementation ...
- MySQL一致性非锁定读
一致性非锁定读(consistent nonlocking read)是指InnoDB存储引擎通过多版本控制(multi versionning)的方式来读取当前执行时间数据库中行的数据,如果读取的行 ...
- eplise中运行提示 A fatal error has been detected by the java runtime environment
今天一同事出现运行项目时,提示 A fatal error has been detected by the java runtime environment,具体表现是使用我们框架,不能正常的打印日 ...
- 2017.11.22 mysql数据库实现关联表更新sql语句
比如有两张表,其中一张表某个字段的值要关联另一张表进行统计,就要用到mysql的update方法,并且left join另一张表进行联合查询. mysql关联表更新统计 sql语句如下: 代码如下 复 ...
- 复杂链表的复制 -python编写
题目描述 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head.(注意,输出结果中请不要返回参数中的节点引用,否 ...
- 文本编辑器Vim技巧
1. 导入文件内容 :r 文件名 2. 插入当前日期 :r !date 3. :!which ls 4. :r !命令
- Token的概念
转载自:https://ninghao.net/blog/2834 最近了解下基于 Token 的身份验证,跟大伙分享下.很多大型网站也都在用,比如 Facebook,Twitter,Google+, ...
- mysql如何查看错误代码具体释义?(基于perror)
mysql如何查看错误代码具体释义? 关键词:mysql错误代码,mysql错误号 perror 错误号