剑指OFFER之重建二叉树(九度OJ1385)
题目描述:
-
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{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”。
样例输入:
样例输出:
-
No
代码:
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
int findRoot(int *arr1,int begin1,int end1,int *arr2,int begin2,int end2,int *final);
int final[];
int flag = ;
int main(void){
int n,i;
int arr1[];
int arr2[];
while(scanf("%d",&n) != EOF && n <= && n >= ){
//initialize
memset(arr1,,sizeof(int)*);
memset(arr2,,sizeof(int)*);
memset(final,,sizeof(int)*);
flag = ;
//input
for(i=;i<n;i++)
scanf("%d",&arr1[i]);
for(i=;i<n;i++)
scanf("%d",&arr2[i]); if(findRoot(arr1,,n-,arr2,,n-,final) == )
printf("No\n");
else{
for(i=flag+;i<;i++)
printf("%d ",final[i]);
printf("\n");
}
}
return ;
}
int findRoot(int *arr1,int begin1,int end1,int *arr2,int begin2,int end2,int *final){
int i,j;
int sum = ;
if(begin1==end1 && begin2 == end2){
final[flag] = arr1[begin1];
flag--;
return ;
}
for(i=begin1 ; i<=end1;i++){
for(j=begin2 ; j <=end2 ; j++){
if(arr1[i] == arr2[j])
sum++;
}
}
if(sum != (end1-begin1+) && sum != (end2 - begin2+)){
return ;
} final[flag] = arr1[begin1];
flag--; int numberofRoot = -;
for(i=begin2 ; i<=end2 ; i++){
if(arr1[begin1] == arr2[i]){
numberofRoot = i;
//printf("找到跟在arr2的坐标为%d\n",numberofRoot);
break;
}
}
if(numberofRoot != end2){
//printf("right %d %d %d %d\n",begin1+numberofRoot-begin2+1,end1,numberofRoot+1,end2);
if(!findRoot(arr1,begin1+numberofRoot-begin2+,end1,arr2,numberofRoot+,end2,final)){
return ;
}
}
if(numberofRoot != begin2){
//printf("left %d %d %d %d\n",begin1+1,begin1+numberofRoot-begin2,begin2,numberofRoot-1);
if(!findRoot(arr1,begin1+,begin1+numberofRoot-begin2,arr2,begin2,numberofRoot-,final)){//左子树
return ;
}
}
return ;
}
剑指OFFER之重建二叉树(九度OJ1385)的更多相关文章
- 【剑指Offer面试题】 九度OJ1385:重建二叉树
题目链接地址: pid=1385">http://ac.jobdu.com/problem.php?pid=1385 题目1385:重建二叉树 时间限制:1 秒内存限制:32 兆特殊判 ...
- 【剑指Offer面试题】 九度OJ1368:二叉树中和为某一值的路径
题目链接地址: http://ac.jobdu.com/problem.php? pid=1368 题目1368:二叉树中和为某一值的路径 时间限制:1 秒内存限制:32 兆特殊判题:否提交:2252 ...
- 【剑指Offer面试题】 九度OJ1389:变态跳楼梯
转自:http://www.myexception.cn/program/1973966.html 时间限制:1 秒内存限制:32 兆特殊判题:否提交:2331解决:1332 题目描述: 一只青蛙一次 ...
- 【剑指Offer面试题】 九度OJ1518:反转链表
与其非常快写出一段漏洞百出的代码,倒不如细致分析再写出鲁棒的代码. 提前想好測试用例(输入非空等等)进行測试改动代码. 题目链接地址: http://ac.jobdu.com/problem.php? ...
- 剑指Offer:重建二叉树【7】
剑指Offer:重建二叉树[7] 题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5 ...
- 【剑指Offer面试题】 九度OJ1517:链表中倒数第k个结点
鲁棒性是指程序可以推断输入是否符合规范要求,并对不和要求的输入予以 合理的处理. 题目链接地址: http://ac.jobdu.com/problem.php?pid=1517 题目1517:链表中 ...
- 【剑指Offer面试题】 九度OJ1371:最小的K个数
题目链接地址: http://ac.jobdu.com/problem.php?pid=1371 题目1371:最小的K个数 时间限制:1 秒内存限制:32 兆特殊判题:否提交:5938解决:1265 ...
- 【剑指Offer面试题】 九度OJ1516:调整数组顺序使奇数位于偶数前面
题目链接地址: http://ac.jobdu.com/problem.php?pid=1516 题目1516:调整数组顺序使奇数位于偶数前面 时间限制:1 秒内存限制:128 兆特殊判题:否提交:2 ...
- 【剑指Offer面试题】九度OJ1384:二维数组中的查找
下决心AC全部剑指offer面试题. 九度OJ面试题地址:http://ac.jobdu.com/hhtproblems.php 书籍:何海涛--<剑指Offer:名企面试官精讲典型编程题> ...
- 《剑指offer》重建二叉树
本题来自<剑指offer> 重构二叉树 题目: 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2 ...
随机推荐
- BZOJ3681: Arietta
题解: 数据结构来优化网络流,貌似都是用一段区间来表示一个点,然后各种乱搞... 发现主席树好吊...在树上建主席树貌似有三种方法: 1.建每个点到根节点这条链上的主席树,可以回答和两点间的路径的XX ...
- BMP图像格式
BMP(全称Bitmap)是Window操作系统中的标准图像文件格式,可以分成两类:设备相关位图(DDB)和设备无关位图(DIB),使用非常广.它采用位映射存储格式,除了图像深度可选以外,不采用其他任 ...
- <十>面向对象分析之UML核心元素之关系
关系 --->在UML中关系是非常重要的语义,它抽象出对象之间的联系,让对象构成特定的结构. 一,关联关系(association)
- 新闻类App使用的组件
UI SlidingMenu:com.jeremyfeinstein.slidingmenu:滑动菜单 ActionBarSherlock:com.actionbarsherlock:Action B ...
- 【原创】利用Windows系统日志统计员工每天上下班考勤时间
利用Windows系统日志统计员工每天上下班考勤时间(命令行参数为统计月份): using System; using System.Collections.Generic; using System ...
- webdriver(python) 学习笔记三
知识点:简单的对象定位 对象的定位应该是自动化测试的核心,要想操作一个对象,首先应该识别这个对象.一个对象就是一个人一样,他会有各种的特征(属性),如比我们可以通过一个人的身份证号,姓名,或者他住在哪 ...
- Ubuntu 14.04配置FTP服务器
搭建: 1.sudo apt-get update #更新软件 2.sudo apt-get install vsftpd ...
- linux交叉环境的搭建以及嵌入式开发概述
嵌入式开发概述 由嵌入式本身的特性所影响,嵌入式系统开发与通用系统的开发有很大的区别,嵌入式的开发分为系统总体开发,嵌入式硬件开发,嵌入式系统软件开发3大部分 在系统总体开发中,由于嵌入式系统与硬件依 ...
- document.body、document.documentElement和window获取视窗大小的区别
来源:http://www.ido321.com/906.html 在w3school关于window对象的介绍中,介绍了获取浏览器窗口大小的三种方法(浏览器的视口,不包括工具栏和滚动条). 对于In ...
- Java相关书籍推荐
Java从入门到精通(第3版 附光盘) 作 者 明日科技 编 出 版 社 清华大学出版社 出版时间 2012-08-01 版 次 3 页 数 564 印刷时间 2012- ...