题目描述:

输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{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

[九度][何海涛] 重建二叉树相关推荐

  1. [九度][何海涛] 数组中出现次数超过一半的数字

    题目描述: 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2 ...

  2. [九度][何海涛] 乐透之猜数游戏

    题目描述: 六一儿童节到了,YZ买了很多丰厚的礼品,准备奖励给JOBDU里辛劳的员工.为了增添一点趣味性,他还准备了一些不同类型的骰子,打算以掷骰子猜数字的方式发放奖品.例如,有的骰子有6个点数(点数 ...

  3. [九度][何海涛] 栈的压入压出

    题目描述: 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈 ...

  4. [九度][何海涛] 跳台阶

    题目描述: 一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个n级的台阶总共有多少种跳法. 输入: 输入可能包含多个测试样例,对于每个测试案例, 输入包括一个整数n(1<=n< ...

  5. [九度][何海涛] 旋转数组的最小数字

    题目描述: 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素.例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转 ...

  6. [九度][何海涛] 变态跳台阶

    题目描述: 一只青蛙一次可以跳上1级台阶,也可以跳上2级--它也可以跳上n级.求该青蛙跳上一个n级的台阶总共有多少种跳法. 输入: 输入可能包含多个测试样例,对于每个测试案例, 输入包括一个整数n(1 ...

  7. [九度][何海涛] 字符串的排序

    题目描述: 输入一个字符串,按字典序打印出该字符串中字符的所有排列.例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba. 输入: 每个 ...

  8. [九度][何海涛] 矩形覆盖

    题目描述: 我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形.请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法? 输入: 输入可能包含多个测试样例,对于每个测试案例, 输入 ...

  9. [九度][何海涛] 斐波那契数列

    题目描述: 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项.斐波那契数列的定义如下: 输入: 输入可能包含多个测试样例,对于每个测试案例, 输入包括一个整数n(1< ...

最新文章

  1. 活动 | 智源学者计划启动暨联合实验室发布会(4月16日)
  2. redis 突然大量逐出导致读写请求block
  3. Java Web开发Tomcat中三种部署项目的方法
  4. NET问答: 如果动态构建 Query 查询 EntityFramework
  5. 不宜过分炒作第三代半导体材料弯道超车
  6. Spring获取JavaBean的xml形式和注解形式
  7. 由帧内8x8预测到MBAFF时相邻块的推导
  8. java分支讵_Java实现简体字向繁体字的转换
  9. 你所不知道的文件上传更安全的类型判断
  10. flask-uploads 使用报错处理 “IMPORTERROR: CANNOT IMPORT NAME ‘SECURE_FILENAME‘ FROM ‘WERKZEUG‘“
  11. 汇编程序的有符号数与无符号数的加减乘除(8086)
  12. 解决PySide2的This application failed to start because no Qt platform plugin could be initialized问题
  13. Java按照word模板导出、下载文档
  14. 绝绝子!这些技巧真方便
  15. Java实现邮箱发送(阿里云邮箱推送)
  16. 艺赛旗开发技巧-根据文本点击网页元素
  17. c语言指针倒数之和,用C语言将一个数开根号后再取倒数的方法
  18. Spark基础知识(个人总结)
  19. 基于Android的实时共享白板虚拟会议空间设计与实现
  20. Agile | 聊聊敏捷开发

热门文章

  1. 在与 SQL Server 2014建立连接时出现与网络相关的或特定于实例的错误。未找到或无法访问服务器 provider: 命名管道提供程序, error: 40 - 无法打开到 SQL Ser
  2. 一个程序员该有的自我修养
  3. Android快捷方式
  4. 广工大物实验报告十七——铁磁材料的磁滞回线和基本磁化曲线
  5. pat 1124 Raffle for Weibo Followers(20 分)
  6. Java下载安装及配置
  7. mysql只读事务不分配事务id_只读事务是否做无用功?
  8. 网上书城项目前端界面设计及编码
  9. 从50亿图文中提取中文跨模态新基准Zero,奇虎360全新预训练框架超越多项SOTA
  10. 代理工具SPP的使用