首页 > 其他分享 >洛谷P1827 [USACO3.4] 美国血统 题解

洛谷P1827 [USACO3.4] 美国血统 题解

时间:2024-09-28 10:50:22浏览次数:10  
标签:遍历 洛谷 int 题解 前序 len USACO3.4 ML 中序

上题目:

题目描述

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

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

这是在样例输入和样例输出中的树的图形表达方式:

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

附注:

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

输入格式

第一行一个字符串,表示该树的中序遍历。

第二行一个字符串,表示该树的前序遍历。

输出格式

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

输入输出样例

输入 #1复制

ABEDFCHG
CBADEFGH 

输出 #1复制

AEFDBHGC

题目解析

这题废话真多,不就是让我们求二叉树的后序遍历;

所以我们该怎嘛做,大家知道二叉树的

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

 那就是不停求根,划分左右;这样的步骤我们用递归实现是最好的选择;

因为别的方法太肝了.........................

那我们该怎样实现呢?

我们假设后序遍历便利的左端点是PL,右端点是PR;

前序便利的左端点是ML,右端点是MR;

像这样

 第一步找根,我们知道后序遍历的根在最前面,那我们该怎样求出跟在中序遍历的位置呢;

我们可以暴力扫一遍,如果等于就用变量存下来

代码:

	int k;
	for(int i = ML;i<=MR;++i){
		if(in[i]==first[PL]){
			k = i;
			break;
		}
	}

 in是中序遍历,first是前序便利的数组

太棒了我们成功解决了根的问题;

那划分的问题我们该怎样解决/

我们设len是中序便利的长度

中序遍历的划分:

        中序遍历是左根右那跟左边不就是0~k-1

        右边就是k+1~len

 

 前序便利划分:

        前序便利是根左右,因为第一个是根所以,也就是PL是根;

        那想划分左右就得先知道左边有多少个;

        那左边的个数不就是K-ML

        

 划分部分代码

	int len = k - ML;
	behind_tree_dfs(ML,k-1,PL+1,PL+len);
	behind_tree_dfs(k+1,MR,PL+len+1,PR);

废话不多说上AC代码

#include <bits/stdc++.h>
using namespace std;
string first,in;
void behind_tree_dfs(int ML,int MR,int PL,int PR){
	if(ML>MR) return ;
	int k;
	for(int i = ML;i<=MR;++i){
		if(in[i]==first[PL]){
			k = i;
			break;
		}
	}
	int len = k - ML;
	behind_tree_dfs(ML,k-1,PL+1,PL+len);
	behind_tree_dfs(k+1,MR,PL+len+1,PR);
	cout<<first[PL];
}
int main(){
	cin>>in>>first;
	int len = in.size();
	behind_tree_dfs(0,len-1,0,len-1);
	return 0;
}

 今天的题解就结束了,我们下次再见!!!

标签:遍历,洛谷,int,题解,前序,len,USACO3.4,ML,中序
From: https://blog.csdn.net/djy2024/article/details/142610825

相关文章

  • 洛谷P1162 填涂颜色题解
    老规矩上题目:题目描述由数字 00 组成的方阵中,有一任意形状的由数字 11 构成的闭合圈。现要求把闭合圈内的所有空间都填写成 22。例如:6×66×6 的方阵(n=6n=6),涂色前和涂色后的方阵如下:如果从某个 00 出发,只向上下左右 44 个方向移动且仅经过其他 00 的情况下,无法......
  • 题解 HZOJ 284 超市卖货 C/C++
    题目传送门:超市卖货-题目-OnlineJudge(haizeix.com)https://oj.haizeix.com/problem/284思路:每次寻找价格最高的商品,并尝试卖掉它:寻找未卖出商品的日期,优先锁定其保质期最后一天,若该日期已卖出则继续向前寻找能找到未卖出商品的日期时,收入增加,标记该日期代码实现:为......
  • Echarts图表知识点汇总及请求django服务器后端跨域问题解决
    1.引入echartsvue3中通过npm引入:npminstallecharts--saveimport*asechartsfrom'echarts';//基于准备好的dom,初始化echarts实例varmyChart=echarts.init(document.getElementById('main'));//绘制图表myChart.setOption({title:{text:'ECha......
  • P9019 [USACO23JAN] Tractor Paths P 题解
    P9019[USACO23JAN]TractorPathsP题解难度其实绝对不止蓝题。先考虑第一问。维护任意两点之间的最短路是困难的,难以dp或是采取其它方法解决。难以算最短路就转换思路,考虑从\(x\)走\(p\)步能走到哪。考虑到这个东西是有单调性的,也就是说对于\(x<y<z\),从\(x\)能走到......
  • Codeforces Round 944 (Div. 4) A~G题解
    A\(min\)函数和\(max\)函数的使用,按照格式输出即可。#include<bits/stdc++.h>usingnamespacestd;typedeflonglongLL;typedefpair<int,int>PII;voidsolve(){intx,y;cin>>x>>y;cout<<min(x,y)<<'......
  • Codeforces Round 973题解(E)
    E.PrefixGCD假设我们从一个空集合\(b\)开始,不断从\(a\)数组中选择一个元素添加到\(b\)集合的尾部,当把\(a\)数组的元素全部添加到\(b\)中后,得到的\(b\)即为所求的rearrange后的\(a\)。结论1:每次选择使得其和当前\(b\)中所有元素的最大公约数最小的那个\(a_i\)加入到\(b\)的末......
  • ZZJC新生训练赛第一场题解
    先给出比赛链接:https://ac.nowcoder.com/acm/contest/91452下面说一下难度分层:(同一难度下按字典序排序)Easy(简单):B,FMedium(中等):A,E,HHard(困难):C,GAnti-AK(防AK):D,Icin.tie(nullptr)->sync_with_stdio(false);//加速输入输出的A游游的整数翻转将所......
  • 【洛谷】P4819 [中山市选] 杀人游戏 的题解
    【洛谷】P4819[中山市选]杀人游戏的题解题目传送门题解Tarjan我可爱的Tarjan嘻嘻qaq枚举每一个点,然后枚举每条出边,如果相连的两个点在同一个强连通分量中,或者xx......
  • 【洛谷】AT_abc178_d [ABC178D] Redistribution 的题解
    【洛谷】AT_abc178_d[ABC178D]Redistribution的题解洛谷传送门AT传送门题解一个水水的动态规划,阿巴巴巴。题目大概是这样:给定一个正整数SSS,问有多少个数满足以......
  • 【2024秋#113】锦城ACM周测题解
    2024秋#112】锦城ACM周测题解A.awa1思路这里是对答案进行二分,我们预测一个答案的范围,取这个范围的中点,试探是否可行。如果可行,将这个范围的右边的范围缩小到mid(注意我们所求是最短时间,所以当mid可行的时候我们是将预测的最大的值变小),如果不可行,说明我们预测的这个范围左边......