剑指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
- 8
- 样例输出:
-
- 7 4 2 5 8 6 3 1
- No
- 7 4 2 5 8 6 3 1
- 题意分析:
给定一棵二叉树的前序遍历和中序遍历,计算出对应的后序遍历。如果给定的数据不是有效的遍历,则输出“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 题目描述: 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个.例如输 ...
随机推荐
- 笨办法学Python(十四)
习题 14:提示和传递 让我们使用 argv 和 raw_input 一起来向用户提一些特别的问题.下一节习题你会学习如何读写文件,这节练习是下节的基础.在这道习题里我们将用略微不同的方法使用 raw ...
- 复制windows CMD命令行中的内容
标记文本后,按"回车",或鼠标"右键"为从CMD中复制文本. 在CMD中,按鼠标"右键",为在CMD中粘贴文本.
- May 2 2017 Week 18 Tuesday
The beauty of the journey is found in the scenery along the way. 旅行之美在于沿途所见的风景. Several years ago, I ...
- 实现pdf word在线浏览和下载
这篇实现的是在线展示pdf和word并且不能显示下载和打印按钮 一 下载功能: 因为html5给a标签新添加了一个属性download,这个属性可以直接实现下载文件的功能:<a href=&qu ...
- IOS 拉伸图片(封装)
/** * 根据图片名返回一张能够自由拉伸的图片 */ +(UIImage *)resizedImage:(NSString *)name { UIImage *image=[UIImage imag ...
- POJ-2002 Squares---绕点旋转+Hash
题目链接: https://vjudge.net/problem/POJ-2002 题目大意: 有一堆平面散点集,任取四个点,求能组成正方形的不同组合方式有多少. 相同的四个点,不同顺序构成的正方形视 ...
- telegram汉化和代理
telegram在Ubuntu18.04的应用商店中可以一键下载. 1.注册:用国内手机号即可,就是验证码可能很慢. 2.汉化:关注zh-CN 频道,在点击其中的安装链接即可. 3.代理: 如果你使用 ...
- 零基础Centos6搭建Git服务器,及常见问题解决
1.编译安装git 2.1 服务器端: #yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel perl- ...
- Spring boot 自动配置自定义配置文件
示例如下: 1. 新建 Maven 项目 properties 2. pom.xml <project xmlns="http://maven.apache.org/POM/4 ...
- Git永久删除commit--[非教程]
假设当前分支为master,当前的commit情况如下,现在需要删除commit_id_2和commit_id_4: commit_id_1 commit_id_2 commit_id_3 commi ...