首页 > 其他分享 >w9_01

w9_01

时间:2023-05-10 13:00:12浏览次数:26  
标签:pre 遍历 前序 中序 01 序列 节点 w9

题目

# 美国血统

## 题目描述

农夫约翰非常认真地对待他的奶牛们的血统。然而他不是一个真正优秀的记帐员。他把他的奶牛 们的家谱作成二叉树,并且把二叉树以更线性的“树的中序遍历”和“树的前序遍历”的符号加以记录而 不是用图形的方法。

你的任务是在被给予奶牛家谱的“树中序遍历”和“树前序遍历”的符号后,创建奶牛家谱的“树的 后序遍历”的符号。每一头奶牛的姓名被译为一个唯一的字母。(你可能已经知道你可以在知道树的两 种遍历以后可以经常地重建这棵树。)显然,这里的树不会有多于 26 个的顶点。 这是在样例输入和 样例输出中的树的图形表达方式:


```

         C
         /  \
        /  \
       B    G
      / \  /
       A   D  H
        / \
       E   F

```

树的中序遍历是按照左子树,根,右子树的顺序访问节点。

树的前序遍历是按照根,左子树,右子树的顺序访问节点。

树的后序遍历是按照左子树,右子树,根的顺序访问节点。

## 输入格式

第一行: 树的中序遍历

第二行: 同样的树的前序遍历

## 输出格式

单独的一行表示该树的后序遍历。

## 样例 #1

### 样例输入 #1

```
ABEDFCHG
CBADEFGH
```

### 样例输出 #1

```
AEFDBHGC
```

 

解题思路:

前序遍历是先遍历根节点,再遍历根节点的左右子树,所以前序序列的第一个节点,一定是根节点。找到根节点,再确定根节点在中序序列中的位置,

就可以分出左右两棵子树,通过递归不断切割字符串就好了。

根据题目中的例题,可以分析:看到前序序列的第一个字符是 C ,那么根节点就是 C ,找到中序中对应的位置,数下标,发现 C 在 5 处 (注意字符串下标从0开始)令k=5,设在中序序列中根节点的位置是k。

然后在先序序列中把C删掉。

中序序列中C在5处,那么左右子树分别就是ABEDF(0~4)和HG(6~7)。

很容易发现:中序序列中左子树就是从0开始切割到k-1,也就是切割了k个字符;中序序列中右子树就是从k+1开始,一直切割到最后。

然后找前序序列切割的规律。

中序序列中左子树是ABEDF,右子树是HG,对应在前序序列中就是BADEF(0~4)和GH(5~6)。

那么前序序列中左子树是从0开始切割到k-1,也就是切割了k个字符;前序序列中右子树就是从k开始,一直切割到最后。

具体代码如下:

#include<string>
#include<cstring>
#include<iostream>
#include<cstdio>
using namespace std;
string pre,inor;
void work(string pre,string inor)
{
if(pre.empty())return;
//如果序列空了,就没必要继续了
char root=pre[0];
//取到前序序列的首字母,即根节点
int k=inor.find(root);
//找到中序序列中根节点的位置
pre.erase(pre.begin());
//删去前序序列中的根节点
string leftpre=pre.substr(0,k);
//从0开始切割k个
string rightpre=pre.substr(k);
//从k开始切割到最后
string leftinor=inor.substr(0,k);
//从0开始切割k个
string rightinor=inor.substr(k+1);
//从k+1开始切割到最后
work(leftpre,leftinor);
work(rightpre,rightinor);
printf("%c",root);
//因为要输出后序序列,所以是左右根
//先遍历左子树,再右子树,再根节点
}
int main()
{
cin>>inor>>pre;
work(pre,inor);
putchar('\n');
return 0;
}

标签:pre,遍历,前序,中序,01,序列,节点,w9
From: https://www.cnblogs.com/rsy123/p/17387668.html

相关文章

  • 简述2012版SQL SERVER备份还原到2008R2版SQL SERVER的方法(转载)
    转载:http://wfsj.weifang.gov.cn/sy/sjjl/201905/t20190531_5370608.html 目前审计机关数据分析通用的数据库为SQLSERVER2008R2版本。被审计单位相关业务系统的后台数据库主要是ORACLE、SQLSERVER 。审计人员需要将不同类型或者不同SQLSERVER版本的数据库转化到SQLSERVER......
  • GAMES101 VS2019 2022环境配置
    GAMES101VS20192022环境配置Eigen库的配置在官网https://eigen.tuxfamily.org/index.php?title=Main_Page中下载Eigen库的zip格式。将压缩包解压为eigen3同时解压到指定路径,我这里为D:\include\eigen3。使用VS2019创建一个空项目,将代码框架的头文件和源文件加入到项......
  • luogu P3345 [ZJOI2015]幻想乡战略游戏
    P3345[ZJOI2015]幻想乡战略游戏这道题还是比较有意思的,做了一个比较长的时间,但是点分树实在是太毒瘤了,所以记录一下线段树的做法。题面给一棵树,有边权,每次修改一个点的点权,修改完后输出所有点到这棵树的带权重心的贡献,即\(\sumdis_i\timesval_i\)题解考虑朴素的暴......
  • 算法学习day10栈与队列part01-232、225
    packageLeetCode.StackAndQueuepart01;importjava.util.LinkedList;importjava.util.Queue;/***225.用队列实现栈*请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push、top、pop和empty)。*实现MyStack类:*voidpush(intx)将元......
  • 「USACO2016JAN」Subsequences Summing to Sevens
    [USACO16JAN]SubsequencesSummingtoSevensS题目描述FarmerJohn's\(N\)cowsarestandinginarow,astheyhaveatendencytodofromtimetotime.EachcowislabeledwithadistinctintegerIDnumbersoFJcantellthemapart.FJwouldliketota......
  • P8647 [蓝桥杯 2017 省 AB] 分巧克力
    P8647[蓝桥杯2017省AB]分巧克力暴力做法(60分)#include<bits/stdc++.h>usingnamespacestd;constintN=1e5+10;inta[N],b[N];intn,k,sum;booljudge(intx){//倍数判断intans=0;for(inti=0;i<n;i++){intx1=a[i]/x;inty......
  • Luogu P5576 [CmdOI2019]口头禅 题解
    upd:修改了一些思路的表达,帮助理解。首先膜拜yyc大佬出这样的毒瘤好题。另外感谢永无岛、xtx1092515503、hs_black提供的思路。这里整理了一下这些思路,可能会有所启发。题意:给定一个字符串构成的序列,多次查询给定区间内各字符串的最长公共子串长度。提供一种后缀数组+......
  • 「TJOI2018」智力竞赛(二分+DAG最小可相交路径覆盖)
    https://loj.ac/problem/2574这个题目描述扎心了。简要题意:用n+1条可以相交的路径去覆盖DAG,使得没被覆盖的点的权值的最小值最大。首先二分答案,问题转换为有一些点一定要被覆盖,问n+1条路径内有没有解。这个可以暴力费用流,每个点拆成两个点,\(i->i',r=1\),如果这个点必选,则费用为inf,......
  • Office 2019 for Mac v16.74 beta中文版
    office2019BetaforMac带来了许多新功能和改进,例如更加流畅的用户界面、更强大的数据分析功能、更好的协作工具等等。同时,这个版本还提供了更好的性能和稳定性,以及一系列针对Mac用户的特定优化。office2019forMac特点介绍新增功能:带来了许多新的功能和改进,例如更强大的数......
  • 20230509001 - DataTable 导出成Excel
               DataTabledt_e=DataSet0.Tables[0];           SaveFileDialogsaveFileDialog=newSaveFileDialog();           saveFileDialog.Filter="Execlfiles(*.xls)|*.xls";           saveFileDialog.FilterIndex......