信息学奥赛一本通 1916:【01NOIP普及组】求先序排列 | 洛谷 P1030 [NOIP2001 普及组] 求先序排列

news2024/11/16 12:56:52

【题目链接】

ybt 1916:【01NOIP普及组】求先序排列
洛谷 P1030 [NOIP2001 普及组] 求先序排列

【题目考点】

1. 二叉树

【解题思路】

已知中序、后序遍历序列,构建二叉树,而后对该二叉树做先序遍历,得到先序遍历序列。
该题与信息学奥赛一本通 1339:【例3-4】求后序遍历的思路相近。

  1. 后序遍历序列的最后一个字符为根结点的值
  2. 在中序遍历序列中找到根结点字符所在的位置
  3. 在中序遍历序列中确定左子树、右子树的中序遍历序列
  4. 根据左右子树中序遍历序列的长度,在后序遍历序列中找到左右子树的后序遍历序列
  5. 递归调用建树函数,构建二叉树

写法1:使用字符数组

设全局的字符数组:s_m表示中序遍历字符串,s_p表示后序遍历字符串。
建树函数int createTree(int ml, int mr, int pl, int pr)表示以s_m[ml]~s_m[mr]为中序遍历序列,以s_p[pl]~s_p[pr]为后序遍历序列构建二叉树,返回二叉树根结点的地址。

  1. 后序遍历序列中s_p[pr]为根结点的值
  2. s_m[ml]~s_m[mr]中找到s_p[pr]出现的位置为i
  3. 那么s_m[ml]~s_m[i-1]为左子树的中序遍历序列,长度为i-mls_m[i+1]~s_m[mr]为右子树的中序遍历序列,长度为mr-i
  4. 左子树的后序遍历序列长度也是i-ml,即为s_p[pl]~s_p[pl+i-ml-1]。右子树的后序遍历序列为s_p[pl+i-ml]~s_p[pr-1]
  5. 递归调用createTree建树函数,构建二叉树
  6. 输出该树的先序遍历序列
    在这里插入图片描述

写法2:使用string类

思路与写法1相同,不同点在于如果使用string类,需要使用string类对象的substr(起始位置,子串长度)成员函数来取子串,我们需要分别计算出左右子树中序(后序)遍历序列子串的长度。
在这里插入图片描述

【题解代码】

写法1:使用字符数组

#include <bits/stdc++.h>
using namespace std;
#define N 10
struct Node
{
	char val;
	int left, right;
};
Node node[N];
int p;
char s_m[10], s_p[10];
int createTree(int ml, int mr, int pl, int pr)
{
	if(ml > mr || pl > pr)
		return 0;
	int i;
	for(i = ml; i <= mr; ++i)
		if(s_m[i] == s_p[pr])
			break;
	int np = ++p;
	node[np].val = s_p[pr];
	node[np].left = createTree(ml, i-1, pl, pl+i-ml-1);
	node[np].right = createTree(i+1, mr, pl+i-ml, pr-1);
	return np;
}
void preOrder(int r)
{
	if(r == 0)
		return;
	cout << node[r].val;
	preOrder(node[r].left);
	preOrder(node[r].right);
}
int main()
{
	cin >> s_m >> s_p;
	int len = strlen(s_m);
	int root = createTree(0, len-1, 0, len-1);
	preOrder(root);
	return 0;
}

写法2:使用string类

#include<bits/stdc++.h>
using namespace std;
#define N 1005
struct Node
{
	char val;
	int left, right;
};
Node node[N];
int p;
string s_mid, s_post; 
int createTree(string sm, string sp)
{
	if(sm == "" || sp == "")
		return 0;
	int np = ++p, i; 
	node[np].val = sp.back();
	for(i = 0; i < sm.length(); ++i)
		if(sm[i] == sp.back())
			break;
	node[np].left = createTree(sm.substr(0, i), sp.substr(0, i));
	node[np].right = createTree(sm.substr(i+1), sp.substr(i, sp.length()-i-1));
	return np; 
} 
void preOrder(int r)
{
	if(r == 0)
		return;
	cout << node[r].val;
	preOrder(node[r].left);
	preOrder(node[r].right);
}
int main()
{
	cin >> s_mid >> s_post;
	int root = createTree(s_mid, s_post);
	preOrder(root);
	return 0; 
}

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

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

相关文章

质性分析软件nvivo的学习(二)

0、前言&#xff1a; 这部分内容是&#xff0c;质性分析软件nvivo的学习&#xff08;一&#xff09;的衔接内容&#xff0c;建议看完&#xff1a;质性分析软件nvivo的学习&#xff08;一&#xff09;再看这部分内容。这里的笔记都是以nvivo12作为学习案例的&#xff0c;其实不…

JVM垃圾回收的并行与并发

文章目录学习资料垃圾回收的并行与并发并发&#xff08;Concurrent&#xff09;并行&#xff08;Parallel&#xff09;并发 vs 并行总结学习资料 【尚硅谷宋红康JVM全套教程&#xff08;详解java虚拟机&#xff09;】 【阿里巴巴Java开发手册】https://www.w3cschool.cn/aliba…

RHCEansible 任务模块

文件操作模块 file模块 ansible-doc file -s path参数 &#xff1a;必须参数&#xff0c;用于指定要操作的文件或目录&#xff0c;在之前版本的ansible中&#xff0c;使用dest参数或者name参数指定要操作的文件或目录&#xff0c;为了兼容之前的版本&#xff0c;使用dest或n…

STM32的升级--ICP/ISP/IAP以及Ymodem协议分析

ICP/ISP/IAP 区别 ICP(In-Circuit Programing): 通过J-Link/SWD等下载器烧写程序&#xff0c;上位机需要借助其他硬件的参与才能更新固件&#xff0c;可以更新MCU的所有存储区域&#xff1b; ISP(In-System Programing): 通过MCU出厂时固化的一个bootloader升级程序&#xff0…

重点算法排序之快速排序、归并排序(上篇)

文章目录 一、排序的概念及常见的排序算法 二、快速排序的思想及代码详解 2、1 快速排序的思想 2、2 挖坑法 2、2、1 挖坑法实现思想 2、2、2 挖坑法举例 2、2、3 挖坑法代码实现 2、3 左右指针法 2、3、1 左右指针法实现思想 2、3、2 左右指针法举例 2、3、3 左右指针法代码…

类的成员之四:代码块

文章目录一、代码块静态代码块非静态代码块注意总结&#xff1a;由父及子&#xff0c;静态先行属性赋值总结一、代码块 1、代码块的作用&#xff1a;用来初始化类、对象 2、代码块如果有修饰的话&#xff0c;只能使用static 3、分类&#xff1a;静态代码块 vs 非静态代码块 静…

Ubuntu自动登录脚本

Ubuntu自动登录脚本一、!/usr/bin/expect -f的意义二、spawn命令行&#xff1a;三、send命令&#xff1a;四、expect五、interact命令&#xff1a;本人用xshell的SSH登录云服务器&#xff0c;需要从用户Ubuntu切换到root&#xff0c;再切换到lighthouse。编辑了一个自动切换用户…

2-1进程管理-进程与线程

文章目录1.进程2.进程控制块&#xff08;PCB&#xff09;3.进程的状态与转换4.进程通信8.线程9.线程和进程的比较10.线程的实现方式11.多线程模型20.线程的状态与转换1.进程 &#xff08;1&#xff09;进程是程序的一次执行过程 &#xff08;2&#xff09;进程是进程实体的运行…

JavaScript篇.day09-数据类型,表达式,运算符,作用域,语句,严格模式

目录1.数据类型(1)原始数据类型(2)隐式转换(3)逻辑语句中的类型转换(4)数据类型检测2.表达式3.运算符(1)分类(2)其他4.作用域5.语句6.严格模式1.数据类型(1)原始数据类型number, string, boolean, null, undefined, object object对象包含: Array, Function, Date...function f…

【微服务笔记03】微服务组件之Eureka注册中心高可用集群环境搭建

这篇文章&#xff0c;主要介绍微服务组件之Eureka注册中心高可用集群环境搭建。 目录 一、Eureka集群环境 二、搭建Eureka高可用集群环境 2.1、前提准备 &#xff08;1&#xff09;修改hosts配置文件 &#xff08;2&#xff09;创建父工程项目 2.2、搭建Eureka注册中心 …

数据可视化大屏Echarts高级开发散点图实战案例分析(地图扩展插件bmap.min.js、散点图、百度地图控件、柱图、涟漪动图、条件判断颜色)

系列文章目录 燃&#xff0c;拿来即用&#xff01;Echarts动态排名柱状图(自适应电脑和手机端)漏刻有时数据可视化Echarts组件开发(27)&#xff1a;盒须图(箱线图)前后端php交互的实战案例漏刻有时数据可视化Echarts组件开发(26):全国地图三级热力图下钻和对接api自动调用数据…

高压功率放大器在高校实验室的实际应用领域介绍

功率放大器的应用领域是很多电子工程师都关心的问题&#xff0c;那么功率放大器的使用场景又有哪些呢&#xff0c;下面来介绍一下安泰高压功率放大器在各个高校的实际应用情况。 图&#xff1a;激光切割 一、ATA-1000系列宽带功率放大器 应用领域&#xff1a;激光切割 适用高校…

Power BI 可视化修改配色

示例数据&#xff1a; 一、Power BI 按列排序 当把文本字段放在坐标轴&#xff0c;显示的顺序都乱了&#xff0c;完全不是自己想要的&#xff0c;就像下图所示&#xff1a; 默认按照Y轴的数值降序排序&#xff0c;如果选择按照month 以升序排序&#xff0c;就会如下所示&am…

【CDP】CDP集群如何通过Cloudera Manager配置使用SNMP方式转发告警

前言 这篇文章参考了大神的文章&#xff0c;如何在CDH平台上集成SNMP服务&#xff0c;然后实现了CDP集群集成SNMP服务&#xff0c;这里描述下&#xff0c;如何集成步骤&#xff0c;在CDP集群中告警是一个很重要的信息&#xff0c;最直观的衡量一个集群的健康状况&#xff0c;那…

[深度学习] 基于切片辅助超推理库SAHI优化小目标识别

对象检测是迄今为止计算机视觉中最重要的应用领域。然而&#xff0c;小物体的检测和大图像的推理仍然是实际使用中的主要问题&#xff0c;这是因为小目标物体有效特征少&#xff0c;覆盖范围少。小目标物体的定义通常有两种方式。一种是绝对尺度定义&#xff0c;即以物体的像素…

【小程序】自定义组件

文章目录组件的创建与引用自定义组件的样式自定义组件的数据、方法和属性data数据methods 方法properties 属性数据监听器纯数据字段组件的生命周期组件所在页面的生命周期插槽单个插槽多个插槽父子组件之间的通信behaviors组件的创建与引用 创建一个组件的步骤&#xff1a; …

发票额度报销最优排列组合问题

1、问题描述 因为我的公司每个月给员工会有一定的交通费额度&#xff0c;需要拿发票去报销才能获得的。要求的是发票总金额不能大于报销的额度。因此在实际报销的时候&#xff0c;你要一张张发票去排列组合经可能的把报销金额往报销额度那里去凑。比如你有1000元额度&#xff0…

Unity 3D JavaScript 脚本基础||Unity 3D C# 脚本基础

变量 数值变量。var a1000;var b3.1415926;字符串变量。 是由单引号或双引号括起来的 Unicode 字符序列。 布尔值。 只有 true 和 false 。用来描述某个事物为真或为假。 数组 是数据的集合&#xff0c;数组中的每一个元素都有自己独有的下标&#xff0c;下标从0开始计数。 表…

《收获,不止Oracle》读书笔记之第三章逻辑体系世界

1.数据库有序的逻辑体系 2.逻辑体系从老余养殖细细说起 推出的逻辑结构是&#xff1a;表空间&#xff08;tablespace&#xff09;、段&#xff08;segment&#xff09;、区&#xff08;extent&#xff09;、块&#xff08;block&#xff09;。Oracle server正是有条理地通过表空…

基础数学(七)——线性方程组的数值解法

文章目录考试要求基础知识一般求解思路消元法高斯消元法小主元导致的计算失误高斯列主元素消去法&#xff08;期末考试要求之一&#xff09;高斯消元法例题&#xff08;期末必考&#xff09;高斯消元法的优缺点减少fill-in现象&#xff08;了解&#xff09;矩阵分解Doolittle分…