数据结构学习记录——树习题-Complete Binary Search Tree(题目描述、输入输出示例、数据结构的选择、核心算法、计算左子树的规模)

news2024/11/26 4:53:41

目录

题目描述

输入示例

输出示例

数据结构的选择

核心算法

计算左子树的规模

思路

总结


题目描述

现给定一系列不同的非负整数键,如果要求构造出一颗完全二叉树,则可以构造唯一的二叉搜索树。输出此二叉搜索树的层序遍历序列。

完全二叉树

有n个节点的二叉树,对树中节点按从上至下、从左到右顺序进行编号,编号为i(1<= i <= n)节点与满二叉树中编号为i节点在二叉树中位置相同。

二叉搜索树

一颗二叉树,可以为空;如果不为空,满足一下性质:

1.非空左子树的所有键值小于其根节点的键值。

2.非空右子树的所有键值大于其根节点的键值。

3.左、右子树都是二叉搜索树。

输入示例

每个输入文件包含一个测试用例。

对于每种情况,第一行包含正整数N(≤ 1 0 0 0)。

然后下一行给出了 N个不同的非负整数键。一行中的所有数字都用空格分隔,不大于2000。

Sample Input:
10
1 2 3 4 5 6 7 8 9 0

输出示例

对于每个测试用例,在一行中打印相应的完全二叉搜索树的层序遍历序列。

一行中的所有数字必须用空格分隔,并且行的末尾不能有额外的空格。

Sample Output:
6 3 8 1 5 7 9 0 2 4

数据结构的选择

二叉树可以通过数组和链表来实现,我们现在要先确定一下用哪种数据结构来解决这道题目。

在之前的学习中,我们使用链表来实现二叉树的存储。因为在一些较为极端的情况下,二叉树可能向左或向右倾斜的程度比较大,这个时候使用数组来实现的话就会造成很大的空间浪费。这是从空间的一个角度来考虑的,而在遍历上,数组和链表两种实现方式都是差不多的。

现在看回这道题目,它需要进行的操作:

  • 填写数字(也属于某种遍历)
  • 层序遍历

在遍历的角度上来看,两种方式都差不多,所以不考虑了。

从空间的角度上来看,完全二叉树的情况下,数组是不会浪费空间的,故而还不能下定论。

最后看到遍历的方式,发现是层序遍历,这就意味着,如果使用数组实现,那么直接顺序输出就是其层序遍历的遍历序列;而链表的层序遍历需要借助队列来实现,显然更为复杂一点。

所以,我们选择数组来实现。

核心算法

void solve(int ALeft, int ARight, int TRoot)
{  
	 /*  初始调用为 solve(0, N - 1, 0) */
	n = ARight - ALeft + 1;
	if (n == 0)  
		return;
	L = GetLeftLength(n);  /*  计算出n个结点的树其左子树有多少个结点  */
	T[TRoot] = A[ALeft + L];
	LeftTRoot = TRoot * 2 + 1;
	RightTRoot = LeftTRoot + 1;
	solve(ALeft, ALeft + L - 1, LeftTRoot);
	solve(ALeft + L + 1, ARight, RightTRoot);
}

其中A为排序后的序列,我们需要对输入的序列进行排序,才能得到它, ALeft表示序列最左边的位置的下标,ARight则表示序列最右边的位置的下标。

T是我们求的结果树,TRoot就是结果树的根结点。

除了排序之外,还有一步重要的操作:计算左子树的结点个数,只有确定了左子树的结点个数,我们才能确定根结点以及右子树。

计算左子树的规模

思路

9977c82a71f04676b5c392cfdebc3ae8.png

如图所示,完全二叉树的完美二叉树的部分可以用eq?2%5E%7BH%7D-1来表示其结点数,H为其中完美二叉树部分的层数。

接下来把剩余的几个结点个数设为X,总结点数设为N,就可以得到一个关系式:

eq?2%5E%7BH%7D-1%20&plus;%20X%20%3D%20N

061d88a1bb6a47c5a4f8a15c8e1e2882.png 将公式整理成log形式,得:eq?H%20%3D%20%7Blog_%7B2%7D%7D%5E%7B%28N&plus;1-X%29%7D

对于大规模的计算,X对整体的结果影响很小很小,我们把X忽略,故而有:eq?H%20%3D%20%7Blog_%7B2%7D%7D%5E%7B%28N%20&plus;%201%29%7D

N是已知的,所以可以根据这个公式求出H;

继而代入eq?2%5E%7BH%7D-1%20&plus;%20X%20%3D%20N求出X;

现在得到一整棵完全二叉树的结点数了,要怎么求其左子树的结点呢?

一棵完全二叉树的左子树也一定是一棵完全二叉树,所以可以知道其左子树的结点数应为:

eq?L%20%3D%202%5E%7BH%20-%201%7D%20&plus;%20X

54aa382fca1242cab58139adbc513162.png

你以为,这样就完了吗?

看一下另外一种情况,我们就会发现目前的X还不是最正确的X:

9aa2fe133e514def88cfa945e24b07e4.png

很显然,这里的X已经不在左子树的范畴内了。

正确应该为:

ace7e9d9ee5240129dc66f42614542f9.png所以我们应该要对X的取值有一定的限制,或者说,X应该要有一定的范围。

可以考虑,当左子树为一棵完美二叉树时,X可以为0,也可以为eq?2%5E%7BH-1%7D

X为0的情况:

cc971e750e34481a8c6706c3a0f1ad5e.png

X为 eq?2%5E%7BH-1%7D的情况:f1d6f1780eb246f2bcd8c4ac430364c2.png

总结

最后,总结一下计算左子树的规模:

第一步是通过公式eq?H%20%3D%20%7Blog_%7B2%7D%7D%5E%7B%28N%20&plus;%201%29%7D求出H;

第二步是通过公式eq?2%5E%7BH%7D-1%20&plus;%20X%20%3D%20N求出X;

第三步是选出正确的X,f659b50862354f179c6e7faee9f07198.png

最后一步就是代入 eq?L%20%3D%202%5E%7BH%20-%201%7D%20&plus;%20X求出我们最终的结果。


end


学习自:MOOC数据结构——陈越、何钦铭

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

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

相关文章

复习之linux系统中的权限管理

1.权限的查看及读取 &#xff08;1&#xff09;权限的查看 # ls -l file : 查看文件的权限 # ls -ld dir :查看目录权限 &#xff08;2&#xff09;权限的读取 文件的属性叫做文件的元数据。 元数据&#xff08;Metadata&#xff09;&#xff0c;又称中介数据、中继…

chatgpt赋能python:Python为什么运行不出来?

Python为什么运行不出来&#xff1f; Python是一门高级编程语言&#xff0c;被广泛应用于科学计算、机器学习、Web开发等领域。但是&#xff0c;有时候我们在编写Python程序的过程中会遇到各种各样的问题&#xff0c;其中之一就是程序无法运行。那么&#xff0c;Python为什么会…

网页投票系统怎么做如何制作网页投票链接如何投票链接

用户在使用微信投票的时候&#xff0c;需要功能齐全&#xff0c;又快捷方便的投票小程序。 而“活动星投票”这款软件使用非常的方便&#xff0c;用户可以随时使用手机微信小程序获得线上投票服务&#xff0c;很多用户都很喜欢“活动星投票”这款软件。 “活动星投票”小程序在…

mysql版本升级导致的时区问题

背景 公司各个项目组用的mysql 版本不一样&#xff0c;有的是5.x稳定守旧版&#xff0c;有的最近喜欢用8.x高级迎新版&#xff0c;结果出了问题。 现象&#xff0c;数据库中保存的时间与java读取的时间字段不一样。 最开始数据库mysql版本为5.7.28&#xff0c;驱动为5.1 反正…

【C++】queue和priority_queue的用法及模拟实现

目录 一、queue的简介及其使用1、queue的简介2、queue的使用2、queue的模拟实现 二、priority_queue的简介及其使用1、priority_queue的简介2、priority_queue的使用3、priority_queue的模拟实现 一、queue的简介及其使用 1、queue的简介 queue是一种容器适配器&#xff0c;专…

SpringBoot 学习笔记之 “异常处理”

&#x1f34f;&#x1f350;&#x1f34a;&#x1f351;&#x1f352;&#x1f353;&#x1fad0;&#x1f951;&#x1f34b;&#x1f349;&#x1f95d; 异常处理 文章目录 &#x1f34f; 错误处理1、默认规则2、定制错误处理逻辑3、异常处理自动配置原理4、异常处…

用Python发送通知到企业微信,实现消息推送

Hi&#xff0c;大家好&#xff0c;今天就介绍如何实现自动推送消息到企业微信&#xff0c;适合告警类型通知&#xff0c;非常方便。 在华为工作了10年的大佬出的Web自动化测试教程&#xff0c;华为现用技术教程&#xff01;_哔哩哔哩_bilibili在华为工作了10年的大佬出的Web自…

C++服务器框架开发6——日志系统LogFormatter/size_t学习

该专栏记录了在学习一个开发项目的过程中遇到的疑惑和问题。 其教学视频见&#xff1a;[C高级教程]从零开始开发服务器框架(sylar) 上一篇&#xff1a;C服务器框架开发5——日志系统LogAppender/IO类“3种stream”/双感叹号 C服务器框架开发6——日志系统logFormatter/size_t学…

【Python】深度理解Class类、Object类、Type元类;

详解Class类、Object类、Type元类 1.Class类、Object类、Type元类的表面关系2.Class、Object、Type解释1.1关系详解 2.Object类的默认方法作用详解2.2.1 init2.2.2 new2.2.3 repr2.2.4 提要&#xff1a;作为普通的Python开发者来讲&#xff0c;深入理解object、type不是必要的&…

ESP32设备驱动-MSA301加速计传感器驱动

MSA301加速计传感器驱动 文章目录 MSA301加速计传感器驱动1、MSA301介绍2、硬件准备3、软件准备4、驱动实现1、MSA301介绍 MSA301 是一款具有 I2C 数字输出的三轴低 g 加速度计,适用于消费类应用。 它具有 2g/4g/8g/16g 的动态用户可选满量程范围,并允许在 1Hz 至 500Hz 的…

Lombok 的正确使用姿势

文章目录 1.Lombok 是什么2.安装 Lombok3.Spring Boot 集成 Lombok4.使用 Lombok4.1 注解一览表4.2 部分使用介绍Getter(lazytrue)ValueBuilderSuperBuilderSneakyThrowsSlf4jCleanupNonNullWithSynchronizedval 在 Java 开发领域中&#xff0c;Lombok 插件已经成为一个非常流行…

OpenGL蓝宝书第八章学习笔记:基元处理之几何着色器

前言 本篇在讲什么 OpenGL蓝宝书第八章学习笔记之几何着色器 本篇适合什么 适合初学OpenGL的小白 本篇需要什么 对C语法有简单认知 对OpenGL有简单认知 最好是有OpenGL超级宝典蓝宝书 依赖Visual Studio编辑器 本篇的特色 具有全流程的图文教学 重实践&#xff0c…

使用scikit-learn和pandas学习线性回归

对于想深入了解线性回归的童鞋&#xff0c;这里给出一个完整的例子&#xff0c;详细学完这个例子&#xff0c;对用scikit-learn来运行线性回归&#xff0c;评估模型不会有什么问题了。 1. 获取数据&#xff0c;定义问题 没有数据&#xff0c;当然没法研究机器学习啦。这里我们用…

buuctf re入门题目解析

目录 1.easyre 2.reverse1 3.reverse2 4.内涵的软件 1.easyre 将exe文件放入ida&#xff0c;在主函数main中找到flag&#xff0c;此题结束 2.reverse1 打开主函数main&#xff0c;发现有一个跳转函数&#xff0c;双击打开 这句命令是将str1和str2的内容比较&#xff0c;当…

「C/C++」C/C++空指针void*

✨博客主页&#xff1a;何曾参静谧的博客 &#x1f4cc;文章专栏&#xff1a;「C/C」C/C程序设计 相关术语 void指针&#xff1a;是一种通用指针类型&#xff0c;可以指向任何类型的数据或对象。它不关心指向的数据或对象的类型&#xff0c;只关心指针本身的地址。因此&#xf…

性能测试—— 基础概念

目录 一、性能测试和功能测试的区别 二、性能测试衡量指标以及名称解释 1、并发用户数、系统用户数、在线用户数 2、响应时间、平均响应时间、请求响应时间 3、事务 4、点击率 5、吞吐量 6、思考时间 7、资源利用率 三、性能测试分类 1、一般性能测试 2、负载测试 …

【Python】函数 ③ ( 函数返回值定义语法 | 函数返回多个返回值 | 代码示例 )

文章目录 一、函数返回值定义语法二、函数返回多个返回值三、函数返回值代码示例 一、函数返回值定义语法 在 Python 函数中 , 通过 return 关键字 , 可以返回一个结果给调用者 , 这个返回结果就是 函数返回值 ; def 函数名(函数参数):"""函数文档字符串&#…

【C++】---模板初阶(超详练气篇)

个人主页&#xff1a;平行线也会相交&#x1f4aa; 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 平行线也会相交 原创 收录于专栏【C之路】&#x1f48c; 本专栏旨在记录C的学习路线&#xff0c;望对大家有所帮助&#x1f647;‍ 希望我们一起努力、成长&…

几种神经网络整定PID参数原理剖析及simulink案例仿真

目录 前言 1 基于单神经元自适应PID Simulink仿真分析 1.1 原理简介 1.1.1 无监督的Hebb学习 ​1.1.2 有监督的Delta学习 1.1.3 有监督的Hebb学习 1.1.4 改进的有监督Hebb学习 1.1.5 总结 1.2 simulink仿真分析 1.2.1 将权值作为状态变量仿真分析 1.2.2 利用局部变量…

Day6 不要二、把字符串转换成整数

✨个人主页&#xff1a; 北 海 &#x1f389;所属专栏&#xff1a; C/C相关题解 &#x1f383;操作环境&#xff1a; Visual Studio 2019 版本 16.11.17 文章目录 选择题1. 计算机组成原理 编程题1. 不要二2. 把字符串转换成为整数 选择题 1. 计算机组成原理 题目&#xff1a…