二叉树-先序+中序序列,输出后序遍历序列 C++代码实现

news/2024/10/19 1:28:05/

这里洛谷的题目提交不了,于是在山东理工大学的ACMOJ上找到了一个类似的题目,不过不是让输出后续遍历的结果,而是输出二叉树的深度。
其实我们把二叉树已经构造好的前提下,输出深度或者后序其实都很easy!

洛谷提交地址

山东理工ACM系统提交地址

思路
(可能说的不清楚,你可以根据题目给的前序和中序样例进行手算)

1、题目中已经给出了前序和中序遍历的结果,分别定义为a和b
根左右 左根右

2、我们先看前序遍历的结果字符串a,第一个字符一定是根节点。
同时在中序列字符串b中找到根节点的下标,那么在这个下标的左边,一定都是
左子树,而右边直至b末尾的字符一定都是右子树(因为中序遍历为 左-根-右)

3、那么这里我们可以将a进行划分成两个片段
从根节点往后数k个(这里的k大小=根节点在b中的下标),这是第一个片段,和b中根节点的左边【对应】
然后其余的直至末尾是第二个片段,和b中根节点的右边【对应】

4、那么新形成的两对字符一一对应,进行递归处理。
还有很重要的一点是,根节点的左右子节点,正好分别是a新划分的第一个片段的第一个字符

#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define sf(x) scanf("%d", &x);
#define de(x) cout << x << " ";
#define Pu puts("");
string a, b;
struct E {int l, r;
} e[75];
void fun(string a, string b, char ch, int op) {if (op == 1)e[ch - 'A'].l = a[0] - 'A';else if (op == 2)e[ch - 'A'].r = a[0] - 'A';int t = b.find(a[0]);if (t != 0) {  // 左fun(a.substr(1, t), b.substr(0, t), a[0], 1);}if (t != b.size() - 1) {  // 右fun(a.substr(t + 1), b.substr(t + 1), a[0], 2);}
}
int getDep(int x) {  // 得到深度if (x == -1)return 0;if (e[x].l == -1 && e[x].r == -1)return 0;return max(getDep(e[x].l), getDep(e[x].r)) + 1;
}
int main() {int T;while (cin >> T) {cin >> a >> b;for (int i = 0; i < 70; i++) {e[i].l = e[i].r = -1;  // 初始化,便于后序遍历输出}int t = b.find(a[0]);if (t != 0) {  // 左fun(a.substr(1, t), b.substr(0, t), a[0], 1);}if (t != b.size() - 1) {  // 右fun(a.substr(t + 1), b.substr(t + 1), a[0], 2);}de(getDep(a[0] - 'A') + 1);Pu;}return 0;
}

http://www.ppmy.cn/news/1062979.html

相关文章

C++学习笔记----深拷贝、浅拷贝

1、构造函数的分类以及使用 深浅拷贝是面试经典问题&#xff0c;也是常见的一个坑 浅拷贝&#xff1a;简单的赋值拷贝操作深拷贝&#xff1a;在堆区重新申请空间&#xff0c;进行拷贝操作 #include <iostream> using namespace std; class Person { public://无参&…

基于Python的网上宠物用品销售网站SpringBoot+Vue宠物用品商城系统源码+lw

&#x1f495;&#x1f495;作者&#xff1a;计算机源码社 &#x1f495;&#x1f495;个人简介&#xff1a;本人七年开发经验&#xff0c;擅长Java、Python、PHP、.NET、微信小程序、爬虫、大数据等&#xff0c;大家有这一块的问题可以一起交流&#xff01; &#x1f495;&…

从程序员到项目经理:职业转型指南

在信息技术领域&#xff0c;从程序员转型为项目经理是一个常见的职业发展方向。这种转型不仅可以带来更广阔的职业机会&#xff0c;还可以让你在团队管理和项目交付方面发挥更大的作用。以下是一份指南&#xff0c;希望可以帮助你顺利从程序员转型为成功的项目经理&#xff1a;…

健康系统练习

健康系统 项目建构&#xff1a; 前后端分离&#xff0c;前端vue3&#xff0c;后端Java&#xff0c;springboot做跨域处理&#xff0c;前端将在vscode中 的tomcat下部署&#xff0c;后端将在ideal中集成的tomcat中部署 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存…

IBM Db2 笔记

目录 1. IBM Db2 笔记1.1. 常用命令1.2. 登录命令行模式 (Using the Db2 command line processor)1.3. issue1.3.1. db2: command not found/SQL10007N Message "-1390" could not be retreived. Reason code: "3".1.3.2. db2 修改 dbm cfg 的时候报 SQL50…

云原生之使用Docker部署SSCMS内容管理系统

云原生之使用Docker部署SSCMS内容管理系统 一、SSCMS介绍二、本地环境介绍2.1 本地环境规划2.2 本次实践介绍 三、本地环境检查3.1 检查Docker服务状态3.2 检查Docker版本3.3 检查docker compose 版本 四、下载SSCMS镜像五、部署SSCMS内容管理系统5.1 创建SSCMS容器5.2 检查SSC…

深度学习1.卷积神经网络-CNN

目录 卷积神经网络 – CNN CNN 解决了什么问题&#xff1f; 需要处理的数据量太大 保留图像特征 人类的视觉原理 卷积神经网络-CNN 的基本原理 卷积——提取特征 池化层&#xff08;下采样&#xff09;——数据降维&#xff0c;避免过拟合 全连接层——输出结果 CNN …

css弹性布局的方式

概述 任何一个容器都可以定义为弹性布局容器&#xff0c;使用display:flex(display:inline-flex)开启弹性布局。 2个方向轴&#xff1a;水平主轴和垂直交叉轴 6个容器属性 1.flex-direction &#xff1a;主轴的方向 2.justify-content&#xff1a;子元素在主轴的对齐方式 …