层序中序还原二叉树

news2024/11/19 11:27:11

题目:

样例:

输入
6
0 2 5 1 4 3
1 2 4 0 5 3

输出
0 2 1 4 5 3

思路:

        这道题,核心思想就是  结合 层序遍历的性质,根据 中序来判断左右孩子是否存在。

前中后序的遍历实现,主要都是 递归的形式实现遍历

而层序遍历是  按照 BFS 的形式迭代遍历 ,以一层一层的搜的。

所以我们建树的时候结合 BFS 的层序规则建树

层序遍历数组中,第一个元素一定是根节点,随后不断的结合 中序数组判断左右子树

代码详解如下:

#include <iostream>
#include <vector>
#include <queue>
#include <cstring>
#include <algorithm>
#include <unordered_map>
#define endl '\n'
#define YES puts("YES")
#define NO puts("NO")
#define umap unordered_map
#define All(x) x.begin(),x.end()
#pragma GCC optimize(3,"Ofast","inline")
#define IOS std::ios::sync_with_stdio(false),cin.tie(0), cout.tie(0)
using namespace std;
const int N = 2e6 + 10;

// 定义结点结构体
struct Node
{
	int val;
	Node*lchild;
	Node*rchild;
	
	// 定义构造函数
	inline Node():val(-1),lchild(NULL),rchild(NULL){};
	// 定义有参构造函数
	inline Node(int x):val(x),lchild(NULL),rchild(NULL){};
}*q[N];		// q 为存储二叉树结点

int n;	// 二叉树结点个数

umap<int,int>inorder,lorder;	// 定义中序数组和层序数组

umap<int,bool>st;	// 标记当且结点是否已经确定过了

// 中序层序建树函数
inline void biuldTree()
{
	// i 为 当且结点,j 为当前下一个结点
	for(int i = 0,j = 1;j < n;)
	{
		// 这一层是层序遍历的效果
		for(int end = j;i < n;++i)
		{
			// 这一层是遍历当前层数的结点个数
			
			int p = inorder[lorder[i]];	// 获取当且结点在中序数组中的下标
		
			st[p] = true;	// 确定当前中序数组下标
			
			if(p && !st[p - 1])
			{
				// 如果左孩子存在,那么给当前结点建树左孩子
				q[i]->lchild = new Node(lorder[j]);
				
				// 这里 j++ = q[i].lchild 是给下一层结点遍历使用
				q[j++] = q[i]->lchild;
			}
			
			if(p + 1 < n && !st[p + 1])
			{
				// 如果右孩子存在,那么给当前结点建树右孩子
				q[i]->rchild = new Node(lorder[j]);
				
				// 这里 j++ = q[i].lchild 是给下一层结点遍历使用
				q[j++] = q[i]->rchild;
			}
		}
	}
}

// 前序遍历函数
void preorder(Node* root)
{
	if(root == NULL) return ;
	cout << root->val;
	if(--n) cout << ' ';
	preorder(root->lchild);
	preorder(root->rchild);
}

inline void solve()
{
	cin >> n;
	// 输入层序遍历数组
	for(int i = 0;i < n;++i)
	{
		cin >> lorder[i];
	}
	// 记录中序遍历数组的下标
	for(int i = 0,x;i < n;++i)
	{
		cin >> x;
		inorder[x] = i;
	}
	
	q[0] = new Node(lorder[0]);	// 确定根节点
	
	biuldTree();	// 开始建树
	
	preorder(q[0]);	// 前序遍历
}

int main()
{
//	freopen("a.txt", "r", stdin);
	IOS;
	int _t = 1;
//	cin >> _t;
	while (_t--)
	{
		solve();
	}

	return 0;
}

最后提交:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1109619.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何使用Python给图片添加水印

目录 一、安装Pillow库 二、导入Pillow库和需要用到的模块 三、添加水印 四、调用函数并设置参数 五、需要注意的方面 总结 在Python中&#xff0c;我们可以使用Pillow库来处理图像&#xff0c;包括添加水印。Pillow是Python中最流行的图像处理库之一&#xff0c;它支持多…

Android中使用Glide加载圆形图像或给图片设置指定圆角

一、Glide加载圆形头像 效果 R.mipmap.head_icon是默认圆形头像 ImageView mImage findViewById(R.id.image);RequestOptions options new RequestOptions().placeholder(R.mipmap.head_icon).circleCropTransform(); Glide.with(this).load("图像Uri").apply(o…

canvas画布绘制线条样式:粗细,圆角,拐角等

线条的粗线 lineWidth是改变线条的粗线的&#xff0c;默认是一个像素&#xff1a; context.beginPath(); context.moveTo(20, 50); context.lineTo(280, 50); context.lineWidth1; context.stroke();// 如果这里没有beginPath 你猜猜这三条线的宽度分别是多少 context.beginP…

分享一下微信投票小游戏怎么做

微信投票小游戏是一种非常有趣和互动的社交体验&#xff0c;可以促进用户参与和互动&#xff0c;同时也可以为企业或个人带来很多好处。下面我们将探讨如何制作一个微信投票小游戏&#xff0c;以及如何为主题写作一篇文章。 一、确定游戏目的和主题 首先&#xff0c;我们需要确…

AWS Lambda – 函数版本,别名,API网关,CodeDeploy协同

Hello大家好&#xff0c;我们今天继续讨论AWS Lambda的内容。 Lambda函数的版本 Lambda函数的版本和别名是辅助资源&#xff0c;我们可以通过创建这些资源管理函数的部署和调用。 首先&#xff0c;让我们来看一下Lambda 函数版本的概念。您可以使用版本来管理函数的部署。例…

汽车屏类产品(三):抬头显示Head-Up Display(HUD)

前言 你的下一台车,一定要考虑加装一个HUD。 汽车抬头显示器或汽车抬头显示器(也称为汽车HUD)是任何透明的显示器,它可以在汽车中显示数据,而不需要用户将视线从平时的视角移开。这个名字的由来源于飞行员能够在头部“向上”并向前看的情况下查看信息,而不是向下倾斜查…

Unity3D 在做性能优化时怎么准确判断是内存、CPU、GPU瓶颈详解

Unity3D是一款广泛应用于游戏开发的跨平台游戏引擎&#xff0c;但在开发过程中&#xff0c;我们经常会遇到性能瓶颈问题&#xff0c;如内存、CPU和GPU瓶颈。本文将详细介绍在Unity3D中如何准确判断和解决这些瓶颈问题&#xff0c;并给出相应的技术详解和代码实现。 对惹&#…

干式电抗器的尺寸和重量对系统有什么影响?

干式电抗器的尺寸决定了它在系统中所占的空间大小&#xff0c;较大尺寸的电抗器需要更多的安装空间&#xff0c;可能会增加系统的体积和复杂性。干式电抗器的重量对系统的负荷和支撑结构有影响&#xff0c;较大重量的电抗器可能需要更强大的支撑结构和更稳固的安装方式&#xf…

若要对多态类进行深拷贝,应使用虚函数的clone,而不是公开的拷贝构造赋值

拷贝一个多态类可能会导致切片问题&#xff0c;为了解决这个问题&#xff0c;应覆盖一个虚clone函数&#xff0c;让他根据实际类型进行复制并返回一个到新对象的所有权的指针&#xff08;std::unique_ptr&#xff09;,在派生类&#xff0c;通过使用所谓的协变返回类型来返回派生…

2023年中国婴童护肤发展概况及趋势分析:婴童功能护肤产品成为新趋势[图]

我国婴童护肤行业相关法律法规逐步完善&#xff0c;推动儿童化妆品的生产与研发&#xff0c;降低消费者购买决策消耗与担忧&#xff1b;2021年10月发布的《儿童化妆品监督管理规定》明确规定儿童化妆品配方设计应当遵循功效必需原则。总的来说&#xff0c;各项政策助力跨境婴童…

为修复各种问题,iOS 17.1应运而生,那么它到底解决什么问题或带来什么功能呢

iOS 17即将进行第一次重大更新&#xff0c;iOS 17.1的候选版本现在掌握在开发人员和测试人员手中。这通常是即将全面释放的迹象。 事实上&#xff0c;我们对iOS 17.1更新何时应该停止有一个很好的想法&#xff0c;这要归功于法国监管机构的一份声明&#xff0c;该声明称即将对…

【Axure教程】多图表动态切换

不同类型的图表用于分析和呈现不同类型的数据&#xff0c;柱状图用于比较不同类别或组之间的数据&#xff1b;条形图用于显示数据的分布情况&#xff0c;特别是连续数据的频率分布&#xff1b;饼图和环形图用于表示各部分占整体的比例&#xff1b;折线图、曲线图和面积图用于显…

解决matlab报错“输入参数的数目不足”

报错语句&#xff1a;tanh((peakNums-parameter)/2) 报错提示&#xff1a;输入参数的数目不足 运行环境&#xff1a;matlab2021b 分析原因&#xff1a; 当执行peakNums - parameter时&#xff0c;如果peakNums和parameter都是向量&#xff0c;那么这并不一定意味着会得到对应…

HR9110S 单通道控制工作原理

HR9110是应用于直流电机方案的单通道H桥驱动器芯片。HR9110的H桥驱动部分采用低导通电阻的PMOS和NMOS功率管。当芯片温度超过温度阈值&#xff08;典型150℃&#xff09;&#xff0c;HR9110会关断所有的输出&#xff0c;防止潜在隐患。只有当确认了芯片回归到工作温度&#xff…

PTE-精听学习(四)

目录 精听练习方法 精听与数量无关&#xff0c;与质量有关 听到一两个单词&#xff0c;就可以默写整句话 出现了过去时&#xff0c;有时间的指示代词 表示原本以为 精听练习方法 精听与数量无关&#xff0c;与质量有关 听到一两个单词&#xff0c;就可以默写整句话 突然…

从入门到进阶 之 ElasticSearch SpringData 继承篇

&#x1f339; 以上分享 从入门到进阶 之 ElasticSearch SpringData 继承篇&#xff0c;如有问题请指教写。&#x1f339;&#x1f339; 如你对技术也感兴趣&#xff0c;欢迎交流。&#x1f339;&#x1f339;&#x1f339; 如有需要&#xff0c;请&#x1f44d;点赞&#x1f…

uniapp vue3 使用pinia存储 并获取数据

存token import { defineStore } from pinia;export const userInfo defineStore(userInfo, {state: () > {return {userToken: uni.getStorageSync(token) || ,};},actions: {// 添加tokenupdateToken(token: string) {uni.setStorageSync(token, token);this.userToken…

移动端1px-从基本原理到开源解决方案介绍

1px 不够准确&#xff0c;应该说成 1 物理像素 为什么有 1px 这个问题&#xff1f;实现 1px 有哪些方法&#xff1f;这些方法分别有哪些优缺点&#xff1f;开源项目中使用的哪些解决方案&#xff1f;如何在项目中处理 1px 的相关问题&#xff1f; 基本概念 首先&#xff0c;我们…

【vue3】异步组件-骨架屏

使用异步组件&#xff0c;在打包的时候&#xff0c;会把异步组件额外打包&#xff0c;在使用的时候才加载。解决项目文件过大&#xff0c;加载白屏的时间过长&#xff0c;造成不好的用户体验。起到性能优化的作用。 一、父级使用&#xff1a; <template><div><S…

前端开发各种loading效果【loading图的顺序对应代码顺序】

效果图 HTML <h1>Pure <b>SVG</b> Loader</h1><!-- Loader1 --><svg version"1.1" id"L1" xmlns"http://www.w3.org/2000/svg" xmlns:xlink"http://www.w3.org/1999/xlink" x"0px" y&quo…