L2-035 完全二叉树的层序遍历(完全二叉树+后序推出层序)

news2024/11/26 5:36:12

本题链接:PTA | 程序设计类实验辅助教学平台

题目:

样例:

输入
8
91 71 2 34 10 15 55 18
输出
18 34 55 71 2 10 15 91

思路:

        根据题意,这是个完全二叉树 + 后序遍历,要求推出层序遍历。

        根据完全二叉树的特性: 

                        设当前结点为 n ,则该左节点 = 2 * n ,  右结点 = 2 * n + 1

        后序遍历特性:

                        对于任意节点,其左子树和右子树都会先被访问,然后才是该节点本身。

所以,对完全二叉树进行后序遍历,遍历顺序为先遍历左子树,再遍历右子树,最后访问根节点。

通过结合这两个特点,我们根据样例画个图。分析一下:

我们再根据题目要求的层序遍历,写个对应的层序数组。

结合: 完美二叉树图 + 后序数组 i 对应关系 + 层序数组 i 关系。

我们可以找到一些规律。

在这里,我们也应该吸取经验。以后遇到完美二叉树的时候,尝试将这些 图 以及对应的数组画出来,结合 完美二叉树的特点

从 后序数组 i 开始,结合 完美二叉树的特点,

                l = i << 1          等于向上查找 的 后序遍历的左结点,

                r = (i << 1) + 1    等于向上查找 的 后序遍历的右结点,

比如 :

后序遍历下标结合完美二叉树特点

i = 1,          l = 2,           r = 3
i = 2,          l = 4,           r = 5

i = 3,          l = 6,           r = 7
i = 4,          l = 8,           r = 9

i = 5,          l = 10,         r = 11

i = 6,          l = 12,         r = 13

i = 7,          l = 14,         r = 15
i = 8,          l = 16,         r = 17

通过上面的后序遍历下标结合完美二叉树特点,我们试着从 1 开始 DFS 递归向上查找:

DFS(1)

DFS(l)

DFS(r)

相应顺序

i = 1,          l = 2,           r = 3
i = 2,          l = 4,           r = 5
i = 4,          l = 8,           r = 9
i = 8,          l = 16,         r = 17
i = 5,          l = 10,         r = 11
i = 3,          l = 6,           r = 7
i = 6,          l = 12,         r = 13
i = 7,          l = 14,         r = 15

我们可以发现,每次向上查找到 根结点 i 之后,就是相应层序遍历tree的 第 i 个 对应的查找到第 n  次根节点的后序遍历的值

例如:

        到达根节点 i =  8 后:91 == a[1] = tree[8]        第 n = 1 次 查找到根节点

        到达根节点 i =  4 后:71 == a[2] = tree[4]        第 n = 2 次 查找到根节点

        到达根节点 i = 5 后:  2  == a[3] = tree[5]        第 n = 3 次 查找到根节点

        到达根节点 i = 2 后: 34 == a[4] = tree[2]        第 n = 4 次 查找到根节点

        到达根节点 i = 6 后: 10 == a[5] = tree[6]        第 n = 5 次 查找到根节点

        到达根节点 i = 7 后: 15 == a[6] = tree[7]        第 n = 6 次 查找到根节点

        到达根节点 i = 3 后: 55 == a[7] = tree[3]        第 n = 7 次 查找到根节点

        最后回到根节点 i = 1 后: 18 == a[8] = tree[1]        第 n = 8 次 查找到根节点

所以结合以上规律可以得到,完美二叉树 + 后序 推出层序规律:

      从后序数组的 1 的底结点开始向上递归查找,查找到的 第 n 个结点就是相应的下标 i 层序结点

最后代码详解如下:

#include <iostream>
#include <vector>
#include <queue>
#include <cstring>
#include <algorithm>
#include <unordered_map>
#define endl '\n'
#define int long long
#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;
inline void solve();

signed main()
{
//	freopen("a.txt", "r", stdin);
	IOS;
	int _t = 1;
//	cin >> _t;
	while (_t--)
	{
		solve();
	}
	return 0;
}
int n,t = 1,a[N],tree[N];
void DFS(int i)
{
	if(i > n) return ;//递归边界,以及找到相应的根节点了。
	
	int l = i << 1;	// 向上查找 L 左父结点
	int r = (i << 1) + 1;	// 向上查找 R 右父结点
	
	DFS(l);	// 开始向上 L 查找
	DFS(r);	// 开始向上 R 查找
	
	// 已经查找到 第 t 个结点,
	// 开始赋值相应层序遍历的 i 值为后序遍历的 a[t]值
	tree[i] = a[t++];	
}

inline void solve()
{
	cin >> n;
	for(int i = 1;i <= n;++i) cin >> a[i];
	
	DFS(1);	// 从低结点 1 开始查找
	
	// 输出答案
	for(int i = 1;i <= n;++i)
	{
		if(i != 1) cout << ' ';
		cout << tree[i];
	}
}

最后提交:​​​​​​​

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

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

相关文章

关于阅读源码

关于阅读源码 为什么阅读源码实战过程中&#xff0c;有通过阅读源码突破瓶颈的经历吗对于很多人来说“读源码太枯燥了&#xff0c;没啥意思”阅读源码有哪些好方式与好步骤呢 关于阅读源码的话题&#xff0c;可以说从上学的时候接触的编程语言开始&#xff0c;就一直伴随着我们…

Golang | Leetcode Golang题解之第6题Z字形变换

题目&#xff1a; 题解&#xff1a; func convert(s string, numRows int) string {n, r : len(s), numRowsif r 1 || r > n {return s}t : r*2 - 2ans : make([]byte, 0, n)for i : 0; i < r; i { // 枚举矩阵的行for j : 0; ji < n; j t { // 枚举每个周期的起始…

数据基础设施投资将进一步扩大!请问现在开融资融券账户交易佣金利率最低是多少?怎么开户!

请问现在开融资融券账户交易佣金利率最低是多少&#xff1f;怎么开户&#xff01; 融资融资利率没有最低的说法&#xff0c;利率一般都是相对的&#xff0c;融资融券的利率通常约为6%以上&#xff0c;当然这个也会根据市场货币的政策有所变动&#xff0c;比如现在的的货币政策…

IT公司管理者日常工作思考

一、前言 作为IT公司的管理者,我们应该一切从实际出发,理论和实际相结合,以终为始,带领公司(组织)不断前进。当然前进包括稳重求进,稳步前进,积极扩张,厚积薄发。等等。大多数公司追求的都是稳中求进,没有稳的进都是在冒比较大的风险。积极扩张,又容易出现较大的风…

基于单片机的光伏电量检测系统的设计

**单片机设计介绍&#xff0c;基于单片机的光伏电量检测系统的设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机的光伏电量检测系统的设计概要主要围绕实现光伏电量的实时监测、精准测量以及数据的处理与传输等功能…

记录几个常用命令

目录 一、查询历史命令 二、启动java容器 三、启动java容器并联通mysql容器 一、查询历史命令 # 查出所有"docker run"的历史命令 history | grep "docker run" 二、启动java容器 docker run -itd --name atcc-door -v /home/wwwroot/atcc-door:/hom…

LeetCode 209 长度最小的子数组(滑动窗口,双指针实现)

给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其总和大于等于 target 的长度最小的 连续 子数组 [numsl, numsl1, ..., numsr-1, numsr] &#xff0c;并返回其长度。如果不存在符合条件的子数组&#xff0c;返回 0 。 示例 1&#xff1a; 输入&…

Centos7安装单机版Keepalived

在线安装 yum -y install keepalived 设置开机自启 chkconfig keepalived on; 启动 systemctl start keepalived; 离线安装 1&#xff09;下载安装包上传到服务器。访问网址&#xff1a;Keepalived for Linux 并下载 Keepalived 的安装包。 2&#xff09;解压安装。 cd…

vivado 高级编程功能1

适用于 7 系列、 UltraScale 和 UltraScale FPGA 和 MPSoC 的回读和验证 为 7 系列器件生成已加密文件和已经过身份验证的文件 注释 &#xff1a; 如需获取其它信息 &#xff0c; 请参阅《使用加密确保 7 系列 FPGA 比特流的安全》 ( XAPP1239 ) 。 要生成加密比特流…

Zabbix6 - Centos7部署Grafana可视化图形监控系统配置手册手册

Zabbix6 - Centos7部署Grafana可视化图形监控系统配置手册手册 概述&#xff1a; Grafana是一个开源的数据可视化和监控平台。其特点&#xff1a; 1&#xff09;丰富的可视化显示插件&#xff0c;包括热图、折线图、饼图&#xff0c;表格等&#xff1b; 2&#xff09;支持多数据…

探索大数据时代下与云计算技术融合:实现企业级数据处理与分析的灵活性和效率性

引言&#xff1a; 关联阅读博客文章&#xff1a;深度剖析&#xff1a;计算机集群在大数据体系中的关键角色和技术要点 随着信息时代的到来&#xff0c;数据量的爆炸性增长已成为一种常态。企业、政府、科研机构等各个领域都面临着海量数据的收集、存储、处理和分析的挑战。在…

蓝桥杯-dfs搜索模板题(二)

蓝桥杯-dfs搜索模板题&#xff08;二&#xff09; P1683 入门P1596[USACO10OCT] Lake Counting S1114 棋盘 acwingP1025 [NOIP2001 提高组] 数的划分P1019 [NOIP2000 提高组] 单词接龙结语 P1683 入门 这道题没有回溯的必要&#xff0c;重复走也不计数。最开始的部分要补上。 …

乐校园二手书交易管理系统的设计与实现|Springboot+ Mysql+Java+ B/S结构(可运行源码+数据库+设计文档)大学生闲置二手书在线销售

本项目包含可运行源码数据库LW&#xff0c;文末可获取本项目的所有资料。 推荐阅读300套最新项目持续更新中..... 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 2024年56套包含ja…

0基础如何进入IT行业?

简介&#xff1a; 进入IT行业对于没有任何相关背景知识的人来说可能会具有挑战性&#xff0c;但并非不可能。以下是一些建议&#xff0c;可以帮助他们成功进入IT行业&#xff1a; 1、自学和在线资源&#xff1a;利用在线学习平台&#xff08;如Coursera、edX、Udemy等&…

分享几个可以免费使用的GPT网站吧

1. ChatGAI ChatGAI是一个界面简洁的AI平台&#xff0c;提供App和网页版&#xff0c;每日均有免费使用机会。 2. ChatGPT 本网站向大家开放了ChatGPT 3.5和4.0版本的免费体验&#xff0c;特别适合新用户。每天都有免费次数&#xff0c;响应迅速&#xff0c;注册便捷&#xff0…

【JS】打乱数组顺序,用作领域:随机播放音乐

思路 循环数组随机获取数组下标取值&#xff1a; 取当前随机下标数组取当前循环的下标数组 相互替换步骤3的数组 /*** 随机数组顺序* param {Array} arr 数组* returns Array*/ const shufArr arr > {for (let i arr.length - 1; i > 0; i--) {const j Math.floor(M…

QT网络调试助手

QT网络调试助手 1.开发流程 2.QTtcp服务器   1.1 服务端数据读取   1.2 服务端发送数据-所有客户端   1.3 服务端自动刷新ip地址   1.4 服务端检测客户端断开状态   1.5 服务端发送数据-指定特定客户端发送数据   1.6 服务端停止监听和断开 3.QTtcp客户端 1…

开源推荐榜【PaddleNLP 一款简单易用且功能强大的自然语言处理开发库】

开源地址&#xff1a;https://gitee.com/paddlepaddle/PaddleNLP.git PaddleNLP是一款简单易用且功能强大的自然语言处理开发库。聚合业界优质预训练模型并提供开箱即用的开发体验&#xff0c;覆盖NLP多场景的模型库搭配产业实践范例可满足开发者灵活定制的需求。 一键预测&am…

基于java+SpringBoot+Vue的时装购物系统的设计与实现

基于javaSpringBootVue的时装购物系统的设计与实现 开发语言: Java 数据库: MySQL技术: SpringBoot MyBatis Vue工具: IDEA/Eclipse、Navicat、Maven 系统展示 前台展示 首页&#xff1a;展示商品信息、商品资讯、轮播图等。 商品信息&#xff1a;用户可以查看商品详情、…

基于springboot+vue+Mysql的大学生体质测试管理系统

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…