剑指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 - 重建二叉树的更多相关文章

  1. 剑指Offer - 九度1523 - 从上往下打印二叉树

    剑指Offer - 九度1523 - 从上往下打印二叉树2013-12-01 00:35 题目描述: 从上往下打印出二叉树的每个节点,同层节点从左至右打印. 输入: 输入可能包含多个测试样例,输入以E ...

  2. 剑指Offer - 九度1521 - 二叉树的镜像

    剑指Offer - 九度1521 - 二叉树的镜像2013-11-30 23:32 题目描述: 输入一个二叉树,输出其镜像. 输入: 输入可能包含多个测试样例,输入以EOF结束.对于每个测试案例,输入 ...

  3. 剑指Offer - 九度1368 - 二叉树中和为某一值的路径

    剑指Offer - 九度1368 - 二叉树中和为某一值的路径2013-11-23 03:46 题目描述: 输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.路径定义为从树的根结 ...

  4. 剑指Offer - 九度1350 - 二叉树的深度

    剑指Offer - 九度1350 - 二叉树的深度2013-11-23 00:54 题目描述: 输入一棵二叉树,求该树的深度.从根结点到叶结点依次经过的结点(含根.叶结点)形成树的一条路径,最长路径的 ...

  5. 剑指Offer - 九度1524 - 复杂链表的复制

    剑指Offer - 九度1524 - 复杂链表的复制2014-02-07 01:30 题目描述: 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点 ...

  6. 剑指Offer - 九度1509 - 树中两个结点的最低公共祖先

    剑指Offer - 九度1509 - 树中两个结点的最低公共祖先2014-02-07 01:04 题目描述: 给定一棵树,同时给出树中的两个结点,求它们的最低公共祖先. 输入: 输入可能包含多个测试样 ...

  7. 剑指Offer - 九度1520 - 树的子结构

    剑指Offer - 九度1520 - 树的子结构2013-11-30 22:17 题目描述: 输入两颗二叉树A,B,判断B是不是A的子结构. 输入: 输入可能包含多个测试样例,输入以EOF结束.对于每 ...

  8. 剑指Offer - 九度1508 - 把字符串转换成整数

    剑指Offer - 九度1508 - 把字符串转换成整数2014-02-06 23:46 题目描述: 将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数. 输入: 输入可能包含多个测试样例 ...

  9. 剑指Offer - 九度1504 - 把数组排成最小的数

    剑指Offer - 九度1504 - 把数组排成最小的数2014-02-06 00:19 题目描述: 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个.例如输 ...

随机推荐

  1. 如何利用PHP语言压缩图片?PHP入门教程

    PHP可以控制缩略图清晰度和缩略图之后产生音量的产生.下面我们就来看看如何使用PHP优化我们的压缩图像.  PHP应用程序的开发往往涉及生成缩略图,使用PHP生成缩略图的过程本身并不难,但你知道PHP ...

  2. linux上传、下载文件rz、sz命令

    1.介绍 sz命令是利用ZModem协议来从linux服务器传送文件到本地,一次可以传送一个或多个文件.相对应的从本地上传文件到Linux服务器,可以使用rz命令. 2.参数说明 -a,以文本方式传输 ...

  3. SQL:获取语句执行时间

    项目中查看数据库查询语句执行时间,脚本如下: --清除缓存 CHECKPOINT; DBCC DROPCLEANBUFFERS; DBCC FREEPROCCACHE; DBCC FREESYSTEM ...

  4. Veritas NetBackup™ 状态码"十大"常见报错状态码

    我在刚开始学习Netbackup的时候,没少走弯路.经常会遇到各种稀奇古怪的 error 信息,遇到报错会很慌张,急需一个解决问题的办法.跟无头苍蝇一样,会不加思索地把错误粘到百度上,希望赶紧查找一下 ...

  5. PHP精度问题

    PHP 为任意精度数学计算提供了二进制计算器(Binary Calculator),它支持任意大小和精度的数字,以字符串形式描述 bcadd — 加法bccomp — 比较bcdiv — 相除bcmo ...

  6. rabbitmq安装使用

    使用 http://www.open-open.com/lib/view/open1325131828249.html ubuntu:apt-get install erlang-noxsudo ap ...

  7. cuda数组的拷贝

    原文链接 简单描述一下自己要做的事情:(1)CPU三维的vector--->(2)CPU三维数组--->(3)转换到GPU中的三维数组--->(4)转换到CPU中的三维数组,而其中问 ...

  8. 循环语句:LOOP,WHILE和数字式循环

    一 简单循环 1 语法: LOOP      要执行的语句;      EXIT WHEN <条件语句> --条件满足,退出循环语句  END LOOP; 2 例子: DECLARE    ...

  9. MySQL工作经验

    以下是根据工作中遇到各种场景用到的一些Mysql用法,比较实用,基本是语法之外的一些东西. 修改账户密码 1.打开Mysql控制台,输入原密码: 2.输入以下语法:mysql> set pass ...

  10. Percona-Tookit工具包之pt-stalk

      Preface       We have a lot of methods to diagnose problems in our system such as strace,pstack,gs ...