数据结构学习记录——树习题—Tree Traversals Again(题目描述、输入输出示例、解题思路、解题方法C语言、解析)

news2024/11/27 0:19:47

目录

题目描述

输入示例

输出示例

解题思路 

解题方法(C语言)

解析


题目描述

有序的二叉树遍历可以用堆栈以非递归的方式实现。

例如:

假设遍历一个节点数为6的二叉树(节点数据分别为1到6)时,

堆栈操作为:push(1);push(2);push(3);pop();pop();push(4);pop();pop();push(5);push(6);pop();pop()。

外面可以根据这一操作序列生成一个唯一的二叉树。

我们的任务就是根据给出的操作序列求出该树的后序遍历序列;

换句话说,就是我们之前学习过的,根据给出先序遍历和中序遍历求出该树的后序遍历序列。

输入示例

第一行包含一个正整数N(≤30),它表示树中节点的总数。

接下来的2N行,每行描述一个堆栈操作,

格式为:“Push X”,其中X是被入到堆栈上的节点;

或“Pop”,意思是从堆栈中弹出一个节点。

6
Push 1
Push 2
Push 3
Pop
Pop
Push 4
Pop
Pop
Push 5
Push 6
Pop
Pop

输出示例

对于每个测试用例,在一行中打印相应树的后序遍历序列。

所有数字必须用一个空格隔开,并且行的末尾不能有多余的空格。

3 4 2 6 5 1

解题思路 

解这道题的思路并不难,我们之前就学习过通过两种遍历序列(其中一种为中序序列)就可以确定一颗唯一确定的二叉树,进而得到其余的遍历序列。即先序遍历序列中,第一个节点为根节点;后序遍历序列中,最后一个节点为根节点;中序遍历序列中根节点左右的序列分别是其左右子树的节点。

​​​​​​二叉树的遍历 习题

解题方法(C语言)

void solve(int preL, int inL, int postL, int n)
{
	if(n == 0)
	{
		return;
	}
	if(n == 1)
	{
		post[postL] = pre[preL];
		return;
	}
	root = pre[preL];
	post[postL + n - 1] = root;
	for (i = 0; i < n; i++)
	{
		if (in[inL + i] == root)
			break;
	}
	L = i;
	R = n - L - 1;
	solve(preL + 1, inL, postL, L);
	solve(preL + L + 1, inL + L + 1, postL + L, R);
}

解析

首先讲一下各变量的含义:

root表示当前子树的根节点;

pre表示先序遍历序列;

post表示后序遍历序列;

in表示中序遍历序列;

L表示当前子树的左子树节点个数;

R表示当前子树的右子树节点个数。

序列我们当成一个数组

preL表示当前子树在先序遍历序列中的起始位置的下标;

inL表示当前子树在中序遍历序列中的起始位置的下标;

postL表示当前子树在后序遍历序列中的起始位置的下标;

n表示当前子树的节点个数。

函数的流程:

如果当前子树节点个数为0,则直接返回,没有后序遍历序列;

如果当前子树节点个数为1,则将该节点加入到后序遍历序列中,并返回;

如果当前子树节点个数大于1,则取出当前子树的根节点root,(即先序遍历序列的第一个元素)

将其加入到后序遍历序列的最后一个位置;(后序遍历序列中,最后一个元素为根节点)

然后在中序遍历序列中找到root的位置,将其左边的节点个数记为L,右边的节点个数记为R;

最后就是两个递归:

递归处理左子树,起始位置分别为preL+1、inL、postL,节点个数为L;

递归处理右子树,起始位置分别为preL+L+1、inL+L+1、postL+L,节点个数为R。

 

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

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

相关文章

immersive-translate 安装,个人觉得一款超级好用的浏览器翻译插件

immersive-translate 安装&#xff0c;个人觉得一款超级好用的浏览器翻译插件 immersive-translate 是什么Github 地址主要特性立即安装使用 immersive-translate immersive-translate 是什么 Immersive Dual Web Page Translation Extension - 沉浸式双语网页翻译扩展。 Git…

MSP432学习笔记5——外部中断

所用单片机型号&#xff1a;MSP432P401r 今日继续我的MSP432电赛速通之路。 外部中断是个很有用的配置 STM32几乎每个I/O口都能配置复用为外部中断 但MSP432并不是这样。 我经过查阅数据手册发现支持中断的引脚为&#xff1a; P1^0~ P1^7 P3^0~ P3^7 P5^0~ P5^…

【Python习题】Python课程设计的作业分小组完成得分计算(实现代码)

目录 题目思路分析代码实现效果总结 主要内容是校设课程的习题和课外学习的一些习题。 欢迎关注 『Python习题』 系列&#xff0c;持续更新中 欢迎关注 『Python习题』 系列&#xff0c;持续更新中 题目 【题目描述】Python课程设计的作业分小组完成&#xff0c;规定小组成员1…

​Shodan新手入坑指南​

什么是 Shodan&#xff1f; 首先&#xff0c;Shodan 是一个搜索引擎&#xff0c;但它与 Google 这种搜索网址的搜索引擎不同&#xff0c;Shodan 是用来搜索网络空间中在线设备的&#xff0c;你可以通过 Shodan 搜索指定的设备&#xff0c;或者搜索特定类型的设备&#xff0c;其…

【C++】结构体 - 定义和使用,结构体数组,结构体指针,结构体嵌套结构体,结构体做函数参数,结构体const

文章目录 1. 定义和使用2. 结构体数组3. 结构体指针4. 结构体嵌套结构体5. 结构体做函数参数6. 结构体const 1. 定义和使用 结构体属于用户自定义的数据类型&#xff0c;允许用户存储不同的数据类型。 struct 结构体 {结构体成员列表}; 通过结构体创建变量的方法有三种&…

读数据压缩入门笔记02_二进制和熵

1. 十进制 1.1. 现代数学建立在十进制计数系统之上 2. 二进制 2.1. 二进制计数系统的工作原理与十进制计数系统一样&#xff0c;唯一的区别是前者的基数为2&#xff0c;而后者的基数为10 2.2. 数据压缩所做的就是尽可能减少表示特定数据集时所需的二进制位数量 2.3. 给定任…

WASender - Whatsapp server and bulk sender

WASender 是一个 whatsapp 营销平台&#xff0c;它使用 Laravel 和 Node Js 构建。WhatsApp 是世界上最受欢迎的消息应用程序之一&#xff0c;拥有超过 20 亿活跃用户。这使其成为企业接触潜在客户并与现有客户群互动的有吸引力的平台。WASender 客户可以创建多个设备来向他的目…

NLP基础知识(语法语义、LDA、N-gram、词嵌入)

文章目录 本节课大纲Hyper-simplified linguisticsTerm spotting handling negation, uncertaintyML to expand termspre-NN ML to identify entities and relationsLatent Dirichlet Allocation (LDA)Statistical Models of Language: Zipfs lawvector space embeddings base…

Office project 2016安装

哈喽&#xff0c;大家好。今天一起学习的是project 2016的安装&#xff0c;Microsoft Office project项目管理工具软件&#xff0c;凝集了许多成熟的项目管理现代理论和方法&#xff0c;可以帮助项目管理者实现时间、资源、成本计划、控制。有兴趣的小伙伴也可以来一起试试手。…

【WebLogic】WebLogic 14c服务器实例报BEA-001112的排查和解决

一、问题背景 WebLogic 14c配置了 MySQL 数据源&#xff08;数据库使用的是MySQL的开源版本 - MariaDB&#xff09;&#xff0c;数据源其中一个 Target 为 WebLogic 应用域的一个受管服务器实例 - appServer1&#xff0c;并且为了增强 WebLogic JDBC Pool 里面的数据库连接的可…

NIO之FileChannel解读

目录 基本概述 打开 FileChannel 从 FileChannel 读取数据 向 FileChannel 写数据 关闭 FileChannel FileChannel 的 position 方法 FileChannel 的 size 方法 FileChannel 的 truncate 方法 FileChannel 的 force 方法 FileChannel 的 transferTo 和 transferFro…

华为OD机试真题B卷 Java 实现【寻找峰值】,附详细解题思路

一、题目描述 给定一个长度为n的数组nums&#xff0c;请你找到峰值并返回其索引。数组可能包含多个峰值&#xff0c;在这种情况下&#xff0c;返回任何一个所在位置即可。 1.峰值元素是指其值严格大于左右相邻值的元素。严格大于即不能有等于&#xff1b; 2.假设 nums[-1] n…

齿轮齿条平动模组的制作

1. 运动功能说明 齿轮齿条平动模组的主要运动方式为直流电机带动2个齿轮沿着齿条平行方向前进、后退。 2. 结构说明 本模组主要是由直流电机、齿轮、齿条、光轴、滑块、机架等组成。 3. 电子硬件 在这个示例中&#xff0c;我们采用了以下硬件&#xff0c;请大家参考&#xff1…

Fiddler抓不到包Fiddler chrome Edge无法抓包原因排查Fiddler死活抓不了包

一、问题描述 我这电脑上的Fiddler莫名其妙的死活就是无法抓包&#xff0c;换了几个版本的Fiddler都没有解决&#xff0c;这里参考了一些网上的教程&#xff0c;最终解决了&#xff0c;该文章算是比较详细的一篇介绍Fiddler无法抓包的教程。无法抓包主要由以下原因导致的&#…

1726_使用Python从dbc文件中提取simulink建模数据定义

全部学习汇总&#xff1a; GreyZhang/python_basic: My learning notes about python. (github.com) 使用dbc文件建模完成CAN通讯是一种比较高效的开发模式&#xff0c;不过在建模的过程中dbc文件中描述的数据需要自己去定义。使用文本编辑工具打开dbc文件可以看到&#xff0c…

中国生物科技公司【Advanced Biomed】申请纳斯达克IPO上市

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 猛兽财经获悉&#xff0c;总部位于台湾台南的生物科技公司【Advanced Biomed】近期已向美国证券交易委员会&#xff08;SEC&#xff09;提交招股书&#xff0c;申请在纳斯达克IPO上市&#xff0c;股票代码为&#xff08;AD…

git的本地分支如何关联远程分支,比如github,gitlab,码云等

文章目录 1. 文章引言2. 本地分支如何关联远程分支2.1 远程有分支2.2 远程无分支 3. 总结 1. 文章引言 今天发布某版本的项目&#xff0c;准备创建个v0point1分支&#xff0c;后期如果修改该版本&#xff0c;直接在该分支上修改即可。 首先&#xff0c;使用git branch v0point…

SeaFormer实战:使用SeaFormer实现图像分类任务(一)

文章目录 摘要安装包安装timm安装mmcv安装 grad-cam 数据增强Cutout和MixupEMA项目结构计算mean和std生成数据集 摘要 论文翻译&#xff1a;https://blog.csdn.net/m0_47867638/article/details/130437649?spm1001.2014.3001.5501 官方源码&#xff1a;https://github.com/fu…

Vue2 创建 Vite 项目,新手教学

关于vite Vite是一种快速的现代化构建工具&#xff0c;可以显著提高Web应用程序的开发效率和性能。 以下是一些Vite的好处&#xff1a; 快速的冷启动&#xff1a;Vite使用原生ES模块解析器&#xff0c;在冷启动时会非常快速&#xff0c;不需要像Webpack一样构建整个应用程序。…

Linux输入输出重定向

目录 Linux输入输出重定向 Linux中的默认设备 输入输出重定向定义 输入输出重定向操作符 实用形式 标准输入、标准输出、标准错误 输出重定向案例 案例1 --- 输出重定向&#xff08;覆盖&#xff09; 案例2 --- 输出重定向&#xff08;追加&#xff09; 案例3 --- 错误…