[九度][何海涛] 重建二叉树
- 题目描述:
-
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{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 中序:左根右,前序:根左右。先靠前序把根确定,然后在中序中找根,没找到则不可能。找到就能确定中序中的左半部分右半部分,同时可以推出前序中的左和右,这样就能递归解决子问题。
1 #include <iostream> 2 #include <vector> 3 using namespace std; 4 5 bool convert(int preOrder[], int preBeg, int preEnd, int inOrder[], int inBeg, int inEnd, vector<int> &postOrder) 6 { 7 if (preEnd - preBeg != inEnd - inBeg) 8 return false; 9 10 if (preBeg > preEnd) 11 return true; 12 13 int root = preOrder[preBeg]; 14 int index = -1; 15 for(int i = inBeg; i <= inEnd; i++) 16 if (inOrder[i] == root) 17 { 18 index = i; 19 break; 20 } 21 22 if (index == -1) 23 return false; 24 25 int len = index - inBeg; 26 bool left = convert(preOrder, preBeg + 1, preBeg + len, inOrder, inBeg, index - 1, postOrder); 27 bool right = convert(preOrder, preBeg + len + 1, preEnd, inOrder, index + 1, inEnd, postOrder); 28 postOrder.push_back(root); 29 30 return left && right; 31 } 32 33 int main() 34 { 35 int n; 36 int preOrder[1000]; 37 int inOrder[1000]; 38 while(cin >> n) 39 { 40 for(int i = 0; i < n; i++) 41 cin >> preOrder[i]; 42 for(int i = 0; i < n; i++) 43 cin >> inOrder[i]; 44 45 vector<int> postOrder; 46 47 bool res = convert(preOrder, 0, n - 1, inOrder, 0, n - 1, postOrder); 48 49 if (res) 50 { 51 for(int i = 0; i < postOrder.size(); i++) 52 cout << postOrder[i] << ' '; 53 cout << endl; 54 } 55 else 56 cout << "No" << endl; 57 } 58 }
转载于:https://www.cnblogs.com/chkkch/archive/2012/11/21/2780402.html
[九度][何海涛] 重建二叉树相关推荐
- [九度][何海涛] 数组中出现次数超过一半的数字
题目描述: 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2 ...
- [九度][何海涛] 乐透之猜数游戏
题目描述: 六一儿童节到了,YZ买了很多丰厚的礼品,准备奖励给JOBDU里辛劳的员工.为了增添一点趣味性,他还准备了一些不同类型的骰子,打算以掷骰子猜数字的方式发放奖品.例如,有的骰子有6个点数(点数 ...
- [九度][何海涛] 栈的压入压出
题目描述: 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈 ...
- [九度][何海涛] 跳台阶
题目描述: 一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个n级的台阶总共有多少种跳法. 输入: 输入可能包含多个测试样例,对于每个测试案例, 输入包括一个整数n(1<=n< ...
- [九度][何海涛] 旋转数组的最小数字
题目描述: 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素.例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转 ...
- [九度][何海涛] 变态跳台阶
题目描述: 一只青蛙一次可以跳上1级台阶,也可以跳上2级--它也可以跳上n级.求该青蛙跳上一个n级的台阶总共有多少种跳法. 输入: 输入可能包含多个测试样例,对于每个测试案例, 输入包括一个整数n(1 ...
- [九度][何海涛] 字符串的排序
题目描述: 输入一个字符串,按字典序打印出该字符串中字符的所有排列.例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba. 输入: 每个 ...
- [九度][何海涛] 矩形覆盖
题目描述: 我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形.请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法? 输入: 输入可能包含多个测试样例,对于每个测试案例, 输入 ...
- [九度][何海涛] 斐波那契数列
题目描述: 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项.斐波那契数列的定义如下: 输入: 输入可能包含多个测试样例,对于每个测试案例, 输入包括一个整数n(1< ...
最新文章
- 活动 | 智源学者计划启动暨联合实验室发布会(4月16日)
- redis 突然大量逐出导致读写请求block
- Java Web开发Tomcat中三种部署项目的方法
- NET问答: 如果动态构建 Query 查询 EntityFramework
- 不宜过分炒作第三代半导体材料弯道超车
- Spring获取JavaBean的xml形式和注解形式
- 由帧内8x8预测到MBAFF时相邻块的推导
- java分支讵_Java实现简体字向繁体字的转换
- 你所不知道的文件上传更安全的类型判断
- flask-uploads 使用报错处理 “IMPORTERROR: CANNOT IMPORT NAME ‘SECURE_FILENAME‘ FROM ‘WERKZEUG‘“
- 汇编程序的有符号数与无符号数的加减乘除(8086)
- 解决PySide2的This application failed to start because no Qt platform plugin could be initialized问题
- Java按照word模板导出、下载文档
- 绝绝子!这些技巧真方便
- Java实现邮箱发送(阿里云邮箱推送)
- 艺赛旗开发技巧-根据文本点击网页元素
- c语言指针倒数之和,用C语言将一个数开根号后再取倒数的方法
- Spark基础知识(个人总结)
- 基于Android的实时共享白板虚拟会议空间设计与实现
- Agile | 聊聊敏捷开发
热门文章
- 在与 SQL Server 2014建立连接时出现与网络相关的或特定于实例的错误。未找到或无法访问服务器 provider: 命名管道提供程序, error: 40 - 无法打开到 SQL Ser
- 一个程序员该有的自我修养
- Android快捷方式
- 广工大物实验报告十七——铁磁材料的磁滞回线和基本磁化曲线
- pat 1124 Raffle for Weibo Followers(20 分)
- Java下载安装及配置
- mysql只读事务不分配事务id_只读事务是否做无用功?
- 网上书城项目前端界面设计及编码
- 从50亿图文中提取中文跨模态新基准Zero,奇虎360全新预训练框架超越多项SOTA
- 代理工具SPP的使用