剑指OFFER之重建二叉树(九度OJ1385)
时间:2022-04-22
本文章向大家介绍剑指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”。
样例输入:
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
代码:
#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[1000];
int flag = 999;
int main(void){
int n,i;
int arr1[1000];
int arr2[1000];
while(scanf("%d",&n) != EOF && n <= 1000 && n >= 1){
//initialize
memset(arr1,0,sizeof(int)*1000);
memset(arr2,0,sizeof(int)*1000);
memset(final,0,sizeof(int)*1000);
flag = 999;
//input
for(i=0;i<n;i++)
scanf("%d",&arr1[i]);
for(i=0;i<n;i++)
scanf("%d",&arr2[i]);
if(findRoot(arr1,0,n-1,arr2,0,n-1,final) == 0)
printf("Non");
else{
for(i=flag+1;i<1000;i++)
printf("%d ",final[i]);
printf("n");
}
}
return 0;
}
int findRoot(int *arr1,int begin1,int end1,int *arr2,int begin2,int end2,int *final){
int i,j;
int sum = 0;
if(begin1==end1 && begin2 == end2){
final[flag] = arr1[begin1];
flag--;
return 1;
}
for(i=begin1 ; i<=end1;i++){
for(j=begin2 ; j <=end2 ; j++){
if(arr1[i] == arr2[j])
sum++;
}
}
if(sum != (end1-begin1+1) && sum != (end2 - begin2+1)){
return 0;
}
final[flag] = arr1[begin1];
flag--;
int numberofRoot = -1;
for(i=begin2 ; i<=end2 ; i++){
if(arr1[begin1] == arr2[i]){
numberofRoot = i;
//printf("找到跟在arr2的坐标为%dn",numberofRoot);
break;
}
}
if(numberofRoot != end2){
//printf("right %d %d %d %dn",begin1+numberofRoot-begin2+1,end1,numberofRoot+1,end2);
if(!findRoot(arr1,begin1+numberofRoot-begin2+1,end1,arr2,numberofRoot+1,end2,final)){
return 0;
}
}
if(numberofRoot != begin2){
//printf("left %d %d %d %dn",begin1+1,begin1+numberofRoot-begin2,begin2,numberofRoot-1);
if(!findRoot(arr1,begin1+1,begin1+numberofRoot-begin2,arr2,begin2,numberofRoot-1,final)){//左子树
return 0;
}
}
return 1;
}
- android程序崩溃后重启
- jQuery源码——.html()方法原理解析
- 【翻译】JavaScript内存泄露
- 【翻译】ES6生成器简介
- 浅谈事件冒泡
- Github page搭建博客使用自定义插件的方法
- 【翻译】JavaScript中5个值得被广泛使用的数组方法
- 【翻译】浏览器渲染Rendering那些事:repaint、reflow/relayout、restyle
- Entity Framework Core 实现MySQL 的TimeStamp/RowVersion 并发控制
- 《JQuery技术内幕》读书笔记——自调用匿名函数剖析
- 【代码+论文】通过ML、Time Series模型学习股价行为
- .NET Core 系列5 :使用 Nuget打包类库
- 解决transition动画与display冲突的几种方法
- Gof设计模式之装饰者模式(七)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- PHP-FPM 的管理和配置详解
- PHP基于curl实现模拟微信浏览器打开微信链接的方法示例
- 实例讲解PHP表单验证功能
- python如何从键盘获取输入实例
- 使用Keras实现Tensor的相乘和相加代码
- php无限级分类实现评论及回复功能
- php获取手机端的号码以及ip地址实例代码
- PHP数组遍历的几种常见方式总结
- 详解php协程知识点
- php curl简单采集图片生成base64编码(并附curl函数参数说明)
- PHP通过get方法获得form表单数据方法总结
- PHP filesize函数用法浅析
- PHP中创建和编辑Excel表格的方法
- php二维数组按某个键值排序的实例讲解
- thinkphp5引入公共部分header、footer的方法详解