天梯赛 L2-006 树的遍历 是个人都能看懂

l2-006 树的遍历 (25分)_这两棵树每年必考,会了至少加6分 【码哥说】今天大海学姐给大家讲解一下排序二叉树和平衡二叉树这两个二叉树应用的知识点,可以说,不管是408统考还是自主命题院校,这两个知识点是必考的,少则出个2~4分的选择题,大到有些甚至会出8~10分的算法大题,所以这个知识点一定要拿下。01知识框架02知识点详解1二叉排序树 ①定义与性质:二叉排序树(BST),也称二叉搜索树,或二叉查找树。它要么是一颗空树,要么就是具有如下性质的二... 阅读详情

天梯赛 L2-006 树的遍历

给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列。这里假设键值都是互不相等的正整数。

输入格式:

输入第一行给出一个正整数N(≤30),是二叉树中结点的个数。第二行给出其后序遍历序列。第三行给出其中序遍历序列。数字间以空格分隔。

输出格式:

在一行中输出该树的层序遍历的序列。数字间以1个空格分隔,行首尾不得有多余空格。

输入样例:

7
2 3 1 5 7 6 4
1 2 3 4 5 6 7

输出样例:

4 1 6 3 5 7 2

代码长度限制

16 KB

时间限制

400 ms

内存限制

64 MB

栈限制

8192 KB


原来一直搞不懂树的遍历,首先我们先要搞清楚树的前序,后序,中序遍历,其实我觉得不用理解那么难,前序不就是根节点->左子树->右子树,后序就是左子树->右子树->根节点,中序就是左子树->根节点->右子树,层序遍历就是一层一层的走。

然后把a,b,c想成一个整体,这就用到了dfs的思想,我只管某一块的,下一块的去传递,最终成最小的块。

弄明白了遍历顺序之后,为什么知道中序遍历和(前序或后序)任意一个就可以知道整个树呢,

首先我们观察题目给的后序遍历 :2 3 1 5 7 6 4

后序遍历是左子树->右子树->根节点,也就是说最后一个肯定是根节点,那么我们不就知道了4是根节点了吗。

这时候再观察题目给的中序遍历:1 2 3 4 5 6 7

中序遍历是左子树->根节点->右子树,也就是说左子树肯定在根节点左边,右子树肯定在根节点右边,那我不就知道1 2 3 是一个子树(左),5 6 7 是一个子树(右)。

你刚开始把 2 3 1 5 7 6 4(后序)和  1 2 3 4 5 6 7(中序) 看成一个整体,那我们分析完不就可以把 2 3 1(后序) 和  1 2 3(中序)继续看成一个整体,你可以发现每一个子树都是一个情况,那我们不就可以dfs了吗。

详细实现在代码注释。注意,我们用数组静态存储的时候第一个根节点是1,第2个是2,第三个是3,第四个就是4,以此列推。那么可以发现:

         1 
    2         3 
4    5    6    7

也就是说一个节点 i 的左子节点为2*i,右节点为2*i+1。


附上代码:

#include <bits/stdc++.h>
using namespace std;
int n;
vector <int> hou(35,0);//存后序 
vector <int> zhong(35,0);//存中序 
vector <int> tree(1000005,-1);//存树,初始全是-1,建议开大点,只要别超过数组最大界限就行 
void dfs(int gen,int hou_zuo,int hou_you,int zhong_zuo,int zhong_you)//目前要求的根节点,后序范围,中序范围 
{
	//范围是下标,只要不符合下标范围或者左边大于右边直接结束 
	if( hou_zuo > hou_you || zhong_zuo > zhong_you || hou_zuo < 1 || hou_you < 1 || zhong_zuo < 1 || zhong_you < 1 || hou_zuo > n || hou_you > n || zhong_zuo > n || zhong_you > n) return;
	//cout<<gen<<" "<<hou_zuo<<" "<<hou_you<<" "<<zhong_zuo<<" "<<zhong_you<<'\n';
	tree[gen]=hou[hou_you];//后序遍历最后一个绝对是根节点 
	int gen_zhi=hou[hou_you];//后序遍历最后一个绝对是根节点 ,为了求在中序根节点 
	int gen_index=-1;//后序遍历最后一个绝对是根节点 ,为了求在中序根节点 
	for(int i=zhong_zuo;i<=zhong_you;i++)//遍历这个范围的中序 
	{
		if(zhong[i]==gen_zhi) //找到了直接返回就行,题目说了:这里假设键值都是互不相等的正整数。 
		{
			gen_index=i;//记录下标 1      2    3     4     5     6     7 
			break;      //                       这个^的下标 
		}
	}
	//if(gen_index==-1) cout<<"异常了哥们1"<<'\n';
	map <int,bool> ma;ma.clear();//用字典找在后序遍历的左子树右边界 
	for(int i=zhong_zuo;i<gen_index;i++) ma[ zhong[i] ]=1;
	int zuo_you_xian=-1;
	for(int i=hou_zuo;i<=hou_you;i++)
	{                                     //在后序遍历 
		if( ma[ hou[i] ] == 1 ) continue;//只要是中序遍历的左子树(1 2 3)的键值就继续 
		zuo_you_xian=i;//只要不是中序遍历的左子树(1 2 3)的键值就结束,记录下标  2     3     1     5     7      6      4  
		break;        //                                             							这个^的下标 
	}
	//if(zuo_you_xian==-1) cout<<"异常了哥们2"<<'n'; 
	//cout<<"zuo_you_xian="<<zuo_you_xian<<'\n'; 
	dfs(gen*2,hou_zuo,zuo_you_xian-1,zhong_zuo,gen_index-1);//给左子节点赋值去 
	dfs(gen*2+1,zuo_you_xian,hou_you-1,gen_index+1,zhong_you);//给右子节点赋值去 
}
int main()
{
	cin>>n;//输入节点数量 
	for(int i=1;i<=n;i++) cin>>hou[i];//输入后序遍历 ,从下标1开始 
	for(int i=1;i<=n;i++) cin>>zhong[i];//输入中序遍历 ,从下标1开始  
	dfs(1,1,n,1,n);//dfs,根节点为1,后序范围为1-n,中序范围为1-n 
	/*cout<<"--------------------------------------------------"; 
	for(int i=1;i<=30;i++)
	{
		if( log2(i*1.0) == (int)( log2(i*1.0) ) ) cout<<'\n';
		cout<<i<<":"<<tree[i]<<"  ";
	}
	cout<<"\n--------------------------------------------------\n";*/
	for(int i=1;i<=1000005;i++)//层序输出,也可以用bfs,但是这题没必要,只要大于0就输出呗 
	{
		if(i==1) cout<<tree[i]; 
		else 
		{
			if(tree[i]>0) cout<<' '<<tree[i];	
		}	
	} 
	return 0;	
} 

输出:

7
2 3 1 5 7 6 4
1 2 3 4 5 6 7
1 1 7 1 7
zuo_you_xian=4
2 1 3 1 3
zuo_you_xian=1
5 1 2 2 3
zuo_you_xian=2
10 1 1 2 2
zuo_you_xian=1
3 4 6 5 7
zuo_you_xian=5
6 4 4 5 5
zuo_you_xian=4
7 5 5 7 7
zuo_you_xian=5
--------------------------------------------------
1:4
2:1  3:6
4:-1  5:3  6:5  7:7
8:-1  9:-1  10:2  11:-1  12:-1  13:-1  14:-1  15:-1
16:-1  17:-1  18:-1  19:-1  20:-1  21:-1  22:-1  23:-1  24:-1  25:-1  26:-1  27:-1  28:-1  29:-1  30:-1
--------------------------------------------------
4 1 6 3 5 7 2

 

 

【天梯赛】L2-006. 树的遍历(层次遍历) 题目描述: 给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列。这里假设键值都是互不相等的正整数。 输入格式: 输入第一行给出一个正整数N( 输出格式: 在一行中输出该树的层序遍历的序列。数字间以1个空格分隔,行首尾不得有多余空格。 输入样例: 7 2 3 1 5 7 6 4 1 2 3 4 5 6 7 输出样例: 4 1 6 3 5 7 2 题目思路 阅读详情

相关推荐

【团体程序设计天梯赛】L1~L2实战反思合集(C++)

New:最后那两个长字符串测试点的处理,不要在一开始就将违禁词替换成“<censored>”,而是先替换成“-_-”这样的比较短的字符串,否则违禁词多的时候,不断地改成长替换词,会加重下一次查找操作的负担。此时,我们只要保证生成的过程是“单方向的”,也就是通过递归函数中for的单方向给每个元素赋值,就保证了生成矩阵的唯一性。从而:跑通的次数 = 矩阵的种类数。// 从中序找到根节点,根节点左边就是左子树的中序遍历,得到其长度len,则后序中前len个刚好就是左子树的后序遍历,由此调整区间,重复操作。

H13420972436的博客 1774

7-4 树的遍历 (20 分)

7-4树的遍历(20分) 给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列。这里假设键值都是互不相等的正整数。 输入格式: 输入第一行给出一个正整数N(≤30),是二叉树中结点的个数。第二行给出其后序遍历序列。第三行给出其中序遍历序列。数字间以空格分隔。 输出格式: 在一行中输出该树的层序遍历的序列。数字间以1个空格分隔,行首尾不得有多余空格。 输入样例: 7 2...

韩旭051的博客 6006

已知二叉树的前序和中序遍历,打印后序遍历

已知二叉树的前序和中序遍历,打印后序遍历,采用二叉树的非递归算法,分享给大家~~

PAT L2-006. 树的遍历

#include #include #include using namespace std; char pre[100],mid[100],post[100]; int s; int solo(int k,char *mid,char *post) { if(k return 0; pre[s++]=post[k-1]; char *p=strchr(mid,post[k-

Grit_ICPC的博客 2072

Python实现输入二叉树的先序和中序遍历,再输出后序遍历操作示例

本文实例讲述了Python实现输入二叉树的先序和中序遍历,再输出后序遍历操作。分享给大家供大家参考,具体如下: 实现一个功能:     输入:一颗二叉树的先序和中序遍历     输出:后续遍历 思想: 先序遍历中,第一个元素是树根     在中序遍历中找到树根,左边的是左子树 右边的是右子树 Python代码: # -*- coding:utf-8 -*- def fromFMtoL( mid ): global las #全局后序遍历 global fir #先序遍历 root = fir[0] #取出当前树根 fir = fir[1:] #取出树根后 先序遍历把根拿出

ABAP OO - ALV_TREE例程

项目上比较少有用到ALV_TREE的报表功能,刚好项目上有写了一次,也查阅大量的范例,整合了一写法,给自己做一下笔记。 程序包含功能按钮,按钮下拉,F4帮助,读取选中行,字段双击触发事件,字段前置图标,更新节点,获取节点数据,获取全部子节点,递归算法,DMS模块:创建文档功能,创建文档链接,SNRO创建流水号,缓存数据,下次用户加载进来继续操作。 *&---------------------------------------------------------------------* *&a

大步甩起来 4989

团体程序设计天梯赛 L2 题目合集

目前 L1 的题目已经刷完,打算在赛前刷完 L2 的题目。本来想 L2 的题目都写个相对详细的题解的,但是由于时间已经很紧张了,就只能像来记录 L1题目的形式来 L2 的题解了,让我们都好好加油吧。

Veggie的博客 1万+

Keil中搭建自动化单元测试框架Unity

前言:   虽然一些C++的自动化单元测试框架也能用来C语言单元测试,但那样我们编写C语言程序时需要符合C++的标准,这样有一些C的特性是无法使用的,限制C的特性使用不太好,于是找了一个全部用C实现的自动化测试框架。Unity是一个简单且直接的自动化单元测试框架,它由很少的几个文件构成。 搭建环境:   1.从github上下载最新版本的Unity源码,下载链接:https://github...

程序员的自我修炼 3900

L2-006 树的遍历-团体程序设计天梯赛GPLT

题目来源:团体程序设计天梯赛-练习集 题目地址:L2-006 树的遍历 题目大意 给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列。这里假设键值都是互不相等的正整数。 预备知识: 中序遍历(Inorder Traversal):先遍历左子树,再访问更节点,最后遍历右子树。 后续遍历(Postorder Traversal):先遍历左子树,再遍历右子树,最后访问根节点。 (注意:遍...

Veggie的博客 1万+

从Maya到Unity:3D模型导入全流程避坑指南(含FBX导出设置)

本文详细解析了从Maya导出3D模型至Unity的全流程,重点剖析了FBX格式作为跨软件协作“中间人”的优劣与核心设置。指南涵盖了Maya端模型清理、FBX导出关键配置(如嵌入媒体、轴转换),以及Unity端的模型、材质、动画导入优化与常见问题(如材质丢失、UV法线错误、骨骼动画错乱)的实战解决方案,旨在帮助3D美术师与技术美术建立稳定、高效的工作流。

lg888的博客 791

Jetson Orin NX上CAN总线调试全攻略:从硬件焊接到开机自启动(附常见问题解决方案)

本文详细介绍了在NVIDIA Jetson Orin NX开发板上进行CAN总线调试的全过程,包括硬件焊接、驱动配置、通信测试和开机自启动设置。针对常见问题如信号接反、波特率设置等提供了实用解决方案,帮助开发者快速实现稳定的CAN总线通信。

c2d3e4f的博客 1076

天梯赛L2-006 树的遍历

2)标准 build 函数思路:先明确根节点(后序遍历的最后一个)—> 建立一个映射函数mp用来找到根节点在中序遍历中的位置 —>递归build函数,而左右子树的后序遍历的区间,我觉得是里面的一个难点。左右子树中序遍历的区间很好看出来,因为k是根节点,所以左子树的中序遍历区间就是【il,k-1】,右子树同理;而这个后序遍历的区间咋看呢?因为中序遍历是左子树—>根—>右子树,后序遍历是左子树—>右子树—>根,所以所以其左子树的pl延续下来,又因为中序遍历和后序遍历的长度肯定是一致的,

Ruially的博客 448

使用MiniExcel.SaveAsByTemplate快速地保存百万数据

该代码展示了如何使用MiniExcel快速生成并导出百万级销售数据。核心方法GenerateLargeData()可生成指定数量的随机销售记录,包含客户名、日期、VIP状态、积分等20个字段。通过随机函数模拟真实数据分布,并支持自定义数据量(默认100万条)。配合Excel模板使用MiniExcel.SaveAsByTemplate()方法,能高效地将大数据量导出为Excel文件,且处理速度极快。代码结构清晰,包含数据生成、随机日期辅助方法和数据模型类,适合需要批量生成测试数据或导出大型报表的场景。

大坡3D软件开发 253

【天梯赛:L2-006 树的遍历】

输入第一行给出一个正整数N(≤30),是二叉树中结点的个数。第二行给出其后序遍历序列。第三行给出其中序遍历序列。树的遍历,后序遍历最后一个是根节点,在中序遍历中找到根节点划分左右子树,然后递归建树。层序遍历就是bfs用队列实现。给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列。这里假设键值都是互不相等的正整数。在一行中输出该树的层序遍历的序列。数字间以1个空格分隔,行首尾不得有多余空格。

2302_81229310的博客 490

混响效果的编程实现:Schroeder混响模型与Moorer型混响

Schroeder混响模型是由Manfred R. Schroeder在1962年提出的,它基于一系列串联的反射器(Allpass Comb Filters)和并联的反射器(Feedback Comb Filters)构成。Schroeder混响模型是由Manfred R. Schroeder在1962年提出的,它基于一系列串联的反射器(Allpass Comb Filters)和并联的反射器(Feedback Comb Filters)构成。通过调整各个反射器和全通滤波器的参数,可以实现不同的混响效果。

2301_79326857的博客 1082

前端使用二开Thingsboard一、二、三事(三)-规则链

以项目实战为基础,逐步介绍前端在thingsboard系统二次开发中的一些注意事项以及一些thingsboard一些页面功能讲解,为前端人员开发使用thingsboard提供一种可靠思路,打造一个完美的物联网系统。

weixin_43163457的博客 863

天梯赛L2——006 树的遍历

L2-006 树的遍历 (25 分) 给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列。这里假设键值都是互不相等的正整数。 输入格式: 输入第一行给出一个正整数N(≤30),是二叉树中结点的个数。第二行给出其后序遍历序列。第三行给出其中序遍历序列。数字间以空格分隔。 输出格式: 在一行中输出该树的层序遍历的序列。数字间以1个空格分隔,行首尾不得有多余空格。 输入样例: 7 2 3 1 5 7 6 4 1 2 3 4 5 6 7 输出样例: 4 1 6 3 5 7 2 code: #inclu

索辣鲲。 1877

VS2019编译配置Easy3D

VS2019编译配置Easy3D

dayuhaitang1的博客 2598

天梯赛L2-004,L2-005,L2-006三题题解

因为最近报名了acm校赛,但是感觉自己好久没有做算法题了,为了能维护一下我这个大二老狗的脸,开始做几个算法题复习一下。 这里水题就不放上来了,先放几个树和集合的题。 https://pintia.cn/problem-sets/994805046380707840/problems/994805070971912192 L2-004 这是二叉搜索树吗? 这个题就是给你一个前序遍历的结果,让你判断是...

所爱隔山海 258

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

天梯L2-006 树的遍历

【代码】天梯L2-006 树的遍历。

m0_74958775的博客 246

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

天梯赛 L2-006 树的遍历

这个题目就是考察建树,有两种写法,第一种比较简单,但只适合节点值1e6以内的,第二种使用结构体,地址分配。

m0_74237658的博客 433

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

面向天梯赛编程(L2):二叉树的遍历

回字有四样写法,你知道么?本文简要介绍了二叉树和四种遍历,及其在天梯赛L2中的应用。

2201_76033853的博客 1446

PTA 天梯赛 L2-006 树的遍历(c++代码简单易懂,有详解)

1、层序遍历 先用一个队列来存结点 输出元素 然后看这个结点有没有左右结点 都有的话先存左节点,因为队列先进先出首先后序的根节点是在后面的,这个时候我们在中序里面找到与之匹配的元素 这个位置为index 在index的左边便是左子树,在它的右边便是右子树 然后后序遍历的规则是左孩子 右孩子 根节点 我们可以通过index减去中序遍历的第一个的位置,得到当前这个根节点一共多少个左子树元素 后面的就是右子树的元素个数

tuse101的博客 1295

天梯赛刷题笔记-L2-006 树的遍历

L2-006 树的遍历 (25 分) 给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列。这里假设键值都是互不相等的正整数。 输入格式: 输入第一行给出一个正整数N(≤30),是二叉树中结点的个数。第二行给出其后序遍历序列。第三行给出其中序遍历序列。数字间以空格分隔。 输出格式: 在一行中输出该树的层序遍历的序列。数字间以1个空格分隔,行首尾不得有多余空格。 输入样例: 7 2 3 1 5 7 6 4 1 2 3 4 5 6 7 输出样例: 4 1 6 3 5 7 2 思

m0_59567964的博客 778

天梯赛 L2-006 树的遍历 (25 分)

L2-006 树的遍历 (25 分) 给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列。这里假设键值都是互不相等的正整数。 输入格式: 输入第一行给出一个正整数N(≤30),是二叉树中结点的个数。第二行给出其后序遍历序列。第三行给出其中序遍历序列。数字间以空格分隔。 输出格式: 在一行中输出该树的层序遍历的序列。数字间以1个空格分隔,行首尾不得有多余空格。 输入样例: 7 2 3 1 ...

DanBo_C的博客 651
上一篇: dijkstra算法 打印两个点的所有最短路径 pta L2-001 紧急救援
下一篇: 2025年团体天梯赛 L1-6 L1-8 L2-1 L2-2 L2-3 L2-4
zrknnl
博客等级 码龄3年 30粉丝 5原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值