(HihoCoder - 1049)后序遍历
Time Limit:10000ms
Case Time Limit:1000ms
Memory Limit:256MB
描述

在参与过了美食节之后,小Hi和小Ho在别的地方又玩耍了一阵子,在这个过程中,小Ho得到了一个非常有意思的玩具——一棵由小球和木棍连接起来的二叉树!

小Ho对这棵二叉树爱不释手,于是给它的每一个节点都标记了一个标号——一个属于A..Z的大写字母,并且没有任意两个节点的标号是一样的。小Hi也瞅准了这个机会,重新巩固了一下小Ho关于二叉树遍历的基础知识~就这样,日子安稳的过了两天。

这天,小Ho正好在求解这棵二叉树的前序、中序和后序遍历的结果,但是却在求出前序遍历和中序遍历之后不小心把二叉树摔到了地上,小球和木棍等零件散落了一地!

小Ho损失了心爱的玩具,正要嚎啕大哭起来,所幸被小Hi发现了,劝说道:“别着急,这不是零件都还在么?拼起来不就是了?”

“可是我忘记了二叉树长什么样子了!”小Ho沮丧道。

“这个简单,你不是刚刚求出了这棵二叉树的前序和中序遍历的结果么,利用这两个信息就可以还原出整棵二叉树来哦!”

“这样么?!!”小Ho止住了泪水,问道:“那要怎么做呢?”

没错!小Ho在这一周遇到的问题便是:给出一棵二叉树的前序和中序遍历的结果,还原这棵二叉树并输出其后序遍历的结果。

提示:分而治之——化大为小,化小为无


“这可就要从头说起了,我们先找一棵二叉树作为例子吧!”小Hi在纸上画了画,递给了小Ho。

“不妨假设你的二叉树长成这个样子~”小Hi道。

“可是我的二叉树并不是长成这个样子啊!虽然我读书少,但是你不要骗我好不好!”小Ho一脸气愤道。

“我都说了是假设!是为了能让你明白如何通用的去解决这样的问题!”小Hi无奈道。

“好吧……你接着说。”小Ho算是认可了这个说法。

“那么对于这棵二叉树,你先来计算一下它的前序遍历和中序遍历的结果吧!”小Hi也是毫不含糊就开始下发任务。

“唔……前序遍历是ABDEGHCFIJ,中序遍历……我想想啊……是DBGEHACIJF!”小Ho并没有花费多长时间就给出了答案。

“你还记得前序遍历的递归定义么?”小Hi点了点头又继续问道。

“是‘根节点’+‘左子树的前序遍历’+‘右子树的前序遍历’!”小Ho毫不犹豫的答道:“而在这里体现出来就是‘A’+‘BDEGH’+‘CFIJ’”。

“那中序遍历呢?”小Hi继续问道。

“是‘左子树的中序遍历’+‘根节点’+‘右子树的中序遍历’!在这里也就是‘DBGEH’+‘A’+‘CIJF’。”小Ho这次花的时间更少了。

“还记得动态规划时候我们一般处理的方法么?我们这里也可以这样做哦,如果我们定义post_order(str1, str2)为一棵前序遍历的结果为str1,中序遍历的结果为str2的二叉树的后序遍历的结果的话,我们有没有办法把它化解成为子问题呢?”小Hi道。

“让我想想……”小Ho拿出纸笔开始演算起来:“如果我要求解post-order(str1, str2)的话,首先不难发现,根据‘前序遍历’str1=‘根节点’+‘左子树的前序遍历’+‘右子树的前序遍历’,我可以知道这棵二叉树的根节点root便是str1的第一个字符!”小Ho道。

“而我在知道了‘根节点’root之后,我便可以利用‘中序遍历’str2=‘左子树的中序遍历’+‘根节点’+‘右子树的中序遍历’,求解出‘左子树的中序遍历’str2L和‘右子树的中序遍历’str2R!”

“接下来,由于一棵子树的前序遍历和中序遍历的长度相同,那么仍然是根据‘前序遍历’str1=‘根节点’+‘左子树的前序遍历’+‘右子树的前序遍历’,我可以知道从str1的第2个字符开始的str2L.length()个字符便是‘左子树的前序遍历’str1L,而这之后的部分便是‘右子树的前序遍历’str1R!”小Ho说到这里,顿了顿,希望从小Hi处得到些反馈。

“没错!那你准备如何求解post_order(str1, str2)呢?”小Hi肯定道。

“这只要根据之前求出的结果,和‘后序遍历’=‘左子树的后序遍历’+‘右子树的后序遍历’+‘根节点’,便可以知道\——\post_order(str1,str2)=post_order(str1l,str2l)+post_order(str1r, str2r)+root这样一个式子来!而这个问题的规模——也就是二叉树的大小,是一直在缩小的,所以是能够这样不断的划分做下去的!也就是说我之后可以将当前根节点的左子树又拆分成为两个问题来解决,一直到当前节点是叶子节点了为止!然后慢慢的将这些答案拼成上层的问题的答案,而这个过程只需要使用递归完成就可以了!”

“听起来很容易的样子呢!那你要不要赶紧去实现了算法,算出你的宝贝二叉树长什么样呢?”小Hi满意的点了点头,随即笑着问道。

“那是自然!”


输入

每个测试点(输入文件)有且仅有一组测试数据。

每组测试数据的第一行为一个由大写英文字母组成的字符串,表示该二叉树的前序遍历的结果。

每组测试数据的第二行为一个由大写英文字母组成的字符串,表示该二叉树的中序遍历的结果。

对于100%的数据,满足二叉树的节点数小于等于26。

输出

对于每组测试数据,输出一个由大写英文字母组成的字符串,表示还原出的二叉树的后序遍历的结果。

Sample Input
AB
BA
Sample Output
BA

思路:在题目的提示里已经说的很清楚了,递归。
ps:str1l.assign(str2,0,i)指的是将str2中下标为0开始长度为i的字符串赋值给str1l。

#include<iostream>
#include<string>
using namespace std;void post_order(string str1,string str2)
{char root=str1[0];string str1l,str1r,str2l,str2r;int i,len2=str2.size();for(i=0;i<len2;i++)if(str2[i]==root) break;str2l.assign(str2,0,i);str2r.assign(str2,i+1,len2-i-1);str1l.assign(str1,1,i);str1r.assign(str1,i+1,len2-i-1);if(!str1l.empty()) post_order(str1l,str2l);if(!str1r.empty()) post_order(str1r,str2r);cout<<root;
}int main()
{string str1,str2;cin>>str1>>str2;post_order(str1,str2);cout<<endl;return 0;
}

(HihoCoder - 1049)后序遍历相关推荐

  1. #1049 : 后序遍历(二叉树,DFS)

    #1049 : 后序遍历 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 在参与过了美食节之后,小Hi和小Ho在别的地方又玩耍了一阵子,在这个过程中,小Ho得到了一个非常 ...

  2. 【剑指Offer】23、二叉搜索树的后序遍历序列

      题目描述:   输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同.   解题思路:   对于后续遍历序列,序 ...

  3. 【C++】二叉树的先序、中序、后序遍历序列

    二叉树常用到的遍历有这三种 先序遍历:先遍历根节点,然后再分别遍历左节点和右节点.(根左右) 中序遍历:先遍历左节点,然后再遍历根节点,最后遍历右节点.(左根右) 后序遍历:先遍历左节点,然后再遍历右 ...

  4. 剑指offer:面试题33. 二叉搜索树的后序遍历序列

    题目:二叉搜索树的后序遍历序列 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果.如果是则返回 true,否则返回 false.假设输入的数组的任意两个数字都互不相同. 参考以下这颗二叉搜 ...

  5. 二叉树(C++):创建,前中后序遍历(递归+非递归),获取叶子节点个数,获取树的高度

    文章目录 前言 创建二叉树 先序遍历 中序遍历 后序遍历 获取叶子节点个数 获取树的高度 测试代码 前言 现有如下二叉树: 关于二叉树的相关操作,我们能够发现二叉树从根节点到子节点,以及每个中间节点基 ...

  6. python数据结构与算法:二叉树及三种遍历方式(先序遍历/中序遍历/后序遍历)

    树的实现采用queue的形式: 树的三种遍历方式(广度优先白能力法):先序遍历(根左右),中序遍历(左根右)以及后序遍历(左右根) ######################P6.4 数据结构### ...

  7. 二叉树--先序中序遍历求后序遍历

    先序遍历:根 左 右 中序遍历:左 根 右 后序遍历:左 右 根 我们可以先从先序遍历中找到根节点,由于知道了根节点那么可以依靠中序遍历找到左子树,右子树.这样再去先序遍历中找到左子树的根节点,然后再 ...

  8. [剑指offer] 二叉搜索树的后序遍历序列

    二叉搜索树的后序遍历序列 P157 题目:输入一个数组,判断这个数组是不是一个二叉搜索树的后序遍历的结果. solution:我们知道后序遍历序列的最后一个item是根节点,如果确实是二叉搜索树的后序 ...

  9. 刻意练习:LeetCode实战 -- 二叉树的后序遍历

    背景 今天,第二期基础算法(Leetcode)刻意练习训练营 的打卡任务是二叉树的中序遍历,由于二叉树的遍历方式通常来说有四种:前序遍历.中序遍历.后序遍历以及层次遍历,而LeetCode也有二叉树的 ...

最新文章

  1. 智源大会参会指南:4天 100+场顶尖报告,硬核高密度,如何才能不留遗憾?
  2. Java基础知识强化49:10个实用的但偏执的Java编程技术
  3. 数据中心级交换机考核方法
  4. CG CTF WEB php decode
  5. c++primer 4th edithon 第324页的一个练习题(9.43和9.44)
  6. IdentityServer4与ocelot实现认证与客户端统一入口
  7. 做个环保主义的程序员
  8. python爬虫菜鸟教程-python爬虫项目(新手教程)之知乎(requests方式)
  9. Vue 中watch和computed 的用法及区别
  10. 网络爬虫与信息提取学习笔记_02
  11. 基于NSGA3的swat模型情景的多目标优化算法,python
  12. 文件生成BASE64,base64转文件
  13. DSP之LCD1602笔记
  14. 世外桃源六python_中土世界的世外桃源——新西兰霍比特人小镇全攻略
  15. 扫描技术的原理与应用(Nmap使用)
  16. 百度大脑人脸识别助力企业实现无感考勤
  17. linux内top命令,Linux中的top命令的详细解释
  18. Wireshark 网卡出错 The capture session could not be initiated on interface ‘en0‘
  19. [补充]上集 Ch. 19-12(AJAX)在ListView / GridView的「样版」里面,放置 UpdatePanel
  20. 2020-10-23

热门文章

  1. 16位图,24位图格式分析
  2. 12月7日——培训第15天
  3. JavaScript 变量提升(hoisting)
  4. WEEP10 dp入门
  5. C语言中通过函数指针调用函数
  6. (已解决)vue3使用axios报Uncaught TypeError: Cannot convert undefined or null to object axios.js:1308错误
  7. 【Linux】——parted磁盘分区
  8. 计算机网络之XSS攻击
  9. cordova打印机插件_phonegap/cordova plugin
  10. 程序员如何成长?如何进阶?——一个老程序员的经验分享3