Tree Recovery---POJ--2255

poj_2255_Tree Recovery_解题报告 题目出处 题意:输入两组数据,分别是前序遍历序列和中序遍历序列,你需要编写程序通过这两组数据求出该树的后序遍历序列(前序序列 + 中序序列 = 后序序列) 解法:递归 题目分析: 可以先按照用笔和纸的形式去推导出后序序列。推导过程省略,在推导过程中我们会发现规律: 假设 前序序列是 A B E H F C G I  中序序列是 H E B F A C I G (图如下) 每一 阅读详情

Tree Recovery

Time Limit: 1000MS

 

Memory Limit: 65536K

Total Submissions: 3771

 

Accepted: 2526

Description

Little Valentine liked playing with binary trees very much. Her favorite game was constructing randomly looking binary trees with capital letters in the nodes.
This is an example of one of her creations:


To record her trees for future generations, she wrote down two strings for each tree: a preorder traversal (root, left subtree, right subtree) and an inorder traversal (left subtree, root, right subtree). For the tree drawn above the preorder traversal is DBACEGF and the inorder traversal is ABCDEFG.
She thought that such a pair of strings would give enough information to reconstruct the tree later (but she never tried it).

Now, years later, looking again at the strings, she realized that reconstructing the trees was indeed possible, but only because she never had used the same letter twice in the same tree.
However, doing the reconstruction by hand, soon turned out to be tedious.
So now she asks you to write a program that does the job for her!

Input

The input will contain one or more test cases.
Each test case consists of one line containing two strings preord and inord, representing the preorder traversal and inorder traversal of a binary tree. Both strings consist of unique capital letters. (Thus they are not longer than 26 characters.)
Input is terminated by end of file.

Output

For each test case, recover Valentine's binary tree and print one line containing the tree's postorder traversal (left subtree, right subtree, root).

Sample Input

DBACEGF ABCDEFG

BCAD CBAD

Sample Output

ACBFGED

CDAB

Source

Ulm Local 1997

 

 

 

先读懂题意:

很简洁,就是已知二叉树的前序遍历和中序遍历序列,要求求出后序遍历序列。

 

基本知识:

1)前序遍历:先访问当前节点,然后以前序访问左子树、右子树;

2)中序遍历:先以中序遍历左子树,接着访问当前节点,最后以中序遍历右子树;

3)后序遍历:先以后序遍历左子树,接着以后序遍历右子树,最后访问当前节点;

4)规律:前序遍历的每一个节点,都是当前子树的根节点;同时,以对应的节点为边界,就会把中序遍历的结果分成左子树和右子树;

 

解题思路:

肯定使用递归啦!编写递归函数preInToPost(...),该函数先访问前序遍历序列的当前节点,然后根据该节点值在中序遍历序列中找到所在的位置index,以index作为杠杆点,将中序遍历序列分为左右两个数组,分别作为左子树和右子树,接着依次对左子树、右子树递归调用,最后输出根节点。(后序遍历嘛!)

 

代码如下:

#include <iostream>

#include <string>

 

//在字符数组A中位置start和end之间查找字符c的坐标

int find(char c, char* Arr, int start , int end)

{

         int index = -1;

         for(index=start; index<=end; index++)

         {

                   if(c == Arr[index])

                            return index; 

         }

}

 

void preInToPost(char *preOrder, int preStart, int preEnd,

                                     char *inOrder, int inStart, int inEnd)

{

         char c;      //存储当前前序序列的第一个字符

         int index;         //前序序列第一个字符在中序序列中的下标

        

         //递归退出的边界条件

         if(inStart > inEnd)

                   return;

                  

         //当前中序序列只剩一个字符,也就是说访问到叶子节点了

         //对该节点的后序遍历就是输出直接该节点(该节点左右子树都没了)

         if(inStart == inEnd)     

         {

                   std::cout<<inOrder[inStart];

                   return;    

         }                

        

         c = preOrder[preStart];        //取出当前前序序列的第一个字符

         index = find(c, inOrder, inStart, inEnd);    //找出前序序列第一个字符在中序序列中的下标

        

         //以index为杠杆点,将inOrder分为左右两个数组,这两个数组就是相应的左子树和右子树了

         //而后序遍历就是依次后序遍历左子树、右子树,最后才访问当前根节点

         //index-inStart是左子树的节点个数

         preInToPost(preOrder, preStart+1, preStart+(index-inStart),

                            inOrder, inStart, index-1);    //对左子树递归

                             

         preInToPost(preOrder, preStart+(index-inStart)+1, preEnd,

                            inOrder, index+1, inEnd);    //对右子树递归

        

         //最后输出根节点(后序遍历嘛)

         std::cout<<c;

}

 

int main()

{

         std::string pPreOrder;

         std::string pInOrder;

         while(std::cin>>pPreOrder>>pInOrder)

         {

                   preInToPost(const_cast<char*>(pPreOrder.c_str()), 0, pPreOrder.length()-1,

                                     const_cast<char*>(pInOrder.c_str()), 0, pInOrder.length()-1);

                   std::cout<<std::endl;          

         }

         system("pause");

         return 0;

}

 

 

 

Tree Recovery 哈工大hoj:ACM试题答案。建树后后续遍历出答案 立即下载

相关推荐

POJ 2255 java

提示:二叉树遍历而已,给出前序和中序,求后序 解题思路 1、前序遍历的第一个字母必是 根 2、在中序遍历的字母串中找出 根字母,那么根字母左右两边的字符串就分别是它的左、右子树 3、利用递归复原二叉树(把子树看作新的二叉树) 4、后序遍历特征:后序遍历字母串 自右至左 依次为: 最外层(总树,设为第0层)右子树的根,内1层右子树的根,内2层右子树的根….内n层右子树的根,内n层左子树的根,内n-1层左子树的根……内1层左子树的根,最外层(总树,第0层)左子树的根。把总树的左子树作为新的总树,继续递归即可。 (注意:总树的叶就是作为“单叶”这棵树本身的右根) 5、输出后序遍历时,只需按4的顺序从左到右排列,再倒置输出即可

ACM--二叉树-已知前中序求后序--POJ-2255

北大OJ地址:点击打开链接 Tree Recovery Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 13336 Accepted: 8322 Description Little Valentine liked playing with bin

戎码人生 1859

智能音箱开发者必看:CEVA-BX vs Cadence HiFi音频DSP实战选型指南(附功耗对比表)

本文深入对比了CEVA-BX和Cadence HiFi两大音频DSP架构在智能音箱开发中的性能差异,涵盖语音唤醒、多麦克风阵列处理等核心场景。通过实测数据和功耗对比表,为开发者提供选型参考,帮助优化产品性能和能效表现。

weixin_29309213的博客 226

POJ 2255 Tree Recovery【二叉树重建】

Description Little Valentine liked playing with binary trees very much. Her favorite game was constructing randomly looking binary trees with capital letters in the nodes.This is an example of one of...

weixin_34059951的博客 526

沧小海深入剖析xilinx的GTP/GTX核,掌握高速串行收发机制——第六章 接收端结构及功能说明

总目录在这哦~ https://blog.youkuaiyun.com/z123canghai/article/details/107700878 第六章 接收端结构及功能说明 子目录 6.1 RX的模拟前端 6.2 RX的OOB信号 6.3 RX的均衡器 6.4 RX的CDR 时钟数据恢复 6.5 RX时钟输出结构 6.6 RX 的极性控制 6.7 RX 的PRBS 6.8 Rx字节、字的对齐功能 6.9 Rx接收弹性缓冲区 6.10 Rx的时钟纠正 6.11 Rx接收通道绑定 6...

滄海的博客 1万+

Shell数学计算(算术运算,加减乘除运算)

声明: 本篇博客的学习途径主要为以下网站和课堂讲解,发博客目的仅为学习使用,在该博客的基础上做了一定程序的简略和修改。 参考博客 : 原文链接:http://c.biancheng.net/shell/ Shell数学计算Shell数学计算数学计算命令对整数进行数学运算: (()) / let / $[] /exprShell (())Shell let命令bc命令:一款数学计算器在 Shell 中使用 bc 计算器 Shell数学计算 默认情况下,Shell 不会直接进行算术运算,而是把+两边的数据(数

AKUANer的博客 2万+

【 UVA - 536 】Tree Recovery (二叉树重建) (静态建树)

题目传送 代码: #include<iostream> #include<algorithm> using namespace std; const int maxn=100; string s1,s2; char pre[maxn],in[maxn],l[maxn],r[maxn]; int build(int zz,int zy,int xz,int xy) //中左,中右,先左,先右 { if(xz>xy) return 0; int root=pre[xz];

黑桃 281

利用 Openocd 和 FT2232H 实现 ARMv8(Coretex-A53)高效调试方案

本文详细介绍了如何利用开源工具OpenOCD与高性能USB转接芯片FT2232H,构建一套针对ARMv8架构(如Cortex-A53)的高效、低成本调试方案。内容涵盖从环境搭建、驱动配置、核心调试架构解析到实战问题排查的全过程,帮助开发者实现对多核处理器的透明、可控调试,是嵌入式Linux及底层开发的实用指南。

weixin_29163581的博客 280

POJ 2255 Tree Recovery

POJ 2255 Tree Recovery 模板题 #include<iostream> #include<stdio.h> #include<string.h> using namespace std; #define maxn 50 char str1[maxn],str2[maxn]...

WF830830的博客 206

SAP入门技术分享四:模块化程序

SAP入门技术分享三:模块化程序

ITxiaoangzai的博客 1152

从零开始掌握RDMA拥塞控制:原理、算法与实战解析

本文深入解析了RDMA拥塞控制的核心原理与实战配置。RDMA依赖无损网络保障高性能,其关键在于PFC与ECN两大技术协同防止丢包。文章重点剖析了主流算法DCQCN的工作机制与参数调优,并简要介绍了HPCC与TIMELY等前沿算法。最后提供了在Linux上配置RoCEv2与DCQCN的详细步骤及性能调试方法,帮助读者从零构建稳定的RDMA网络环境。

weixin_28452161的博客 135

POJ 刷题系列:2255. Tree Recovery

POJ 刷题系列:2255. Tree Recovery传送门:POJ 2255. Tree Recovery题意: 给出先序和中序,求后序。 思路: 依旧很水,给定先序易知根结点,从中序中找到根结点就能确定左孩子们和右孩子们,递归建树。最后后序遍历一遍即可。代码如下:import java.io.BufferedReader; import java.io.File; import java

Demon-初来驾到 504

Utrust4701F与Utrust2700R读写器在银河麒麟系统的安装及测试步骤说明

Utrust4701F与Utrust2700R读写器支持银河麒麟系统,广泛应用会员管理、支付管理等领域。本文将重点介绍Utrust4701F与Utrust2700R读写器在银河麒麟系统的安装及测试步骤说明。以上方法适用于主流国产操作系统,如 优麒麟(UbuntuKylin)/ 中标麒麟(NeoKylin) / UOS(统信操作系统)/ 中兴新支点 / 红旗 linux(redflag linux)/ 普华 Linux(I-soft OS) / 威科乐恩 Linux(WiOS)等

华翔天诚科技 1833

POJ-2255 Tree Recovery

POJ-2255 Tree Recovery 题目链接:POJ-2255 题目大意:给定一棵树的前序遍历和中序遍历,让你输出这颗树的后序遍历 解题思路:二分法的思想???? 代码块: #include<iostream> #include<string> using namespace std; string pre, mid; int n = -1; void s...

鱼头的水题之路 223

合成生物学中试:花钱只是开始,烧钱才是常态

2026年合成生物学行业面临严峻产业化挑战:多家企业终止发酵项目或延期投产,显示从实验室到工厂的转化困境。核心问题并非基因合成成本,而是工艺放大难题——67%项目在中试阶段因工艺问题失败。AI辅助无法替代工程经验,菌株-配方-工艺的三元适配需要长期数据积累。中试成本惊人,涉及设备折旧、原料消耗和稀缺工艺人才,而行业普遍回避讨论这些工程现实,导致认知偏差。建议创业者提前布局中试,将其视为核心竞争力而非简单成本项。合成生物学的真正瓶颈在于工程化能力,这需要时间沉淀而非技术叙事。

AIexander的博客 942

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

poj 2255 Tree Recovery

二叉树,给前序中序求后序

繁华过后你还有我 950

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

poj2255 Tree Recovery

Tree Recovery Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 11955   Accepted: 7505 Description Little Valentine liked playing with binary trees very much

Jinbao 652

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

POJ2255-Tree Recovery

全解题报告索引目录 -> 【北大ACM – POJ试题分类】 转载请注明出处:http://exp-blog.com ------------------------------------------------------------------------- 提示:二叉树遍历而已。。。给出前序和中序,求后序 /* Author: Exp...

ζёСяêτ - 小優YoU 6350

Tree Recovery poj 2255 c++

Tree Recovery Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 11421   Accepted: 7167 Description Little Valentine liked playing with binary trees very much. He

u012938194的专栏 657

POJ2255 Tree Recovery 二叉树遍历

Tree Recovery Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 12523   Accepted: 7836 Description Little Valentine liked playing with binary trees very much.

Jonariguez 吾本优秀 1239

poj2255Tree Recovery

数据结构应该有讲,前序遍历和中序遍历 或者是中序遍历和后序遍历可以恢复整个二叉树,然后在建立利用另一种遍历 14272030 h123120 2255 Accepted 688K 0MS G++ 1278B 2015-06-06 17:18:47 #include #include #include #include #include #inc

h123120的专栏 490

Tree Recovery 【POJ - 2255】

Little Valentine liked playing with binary trees very much. Her favorite game was constructing randomly looking binary trees with capital letters in the nodes. This is an example of one of her creatio...

Meant_To_Be的博客 263
上一篇: 《Windows内核编程》の基本汇编指令
下一篇: Ancient Cipher--POJ2159
ACE1985
博客等级 码龄17年 1307粉丝 308原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值