数据结构之树

前面文章讲的线性表,不论数组还是链,都是“一对一”的关系,本文章节让我们来认识一下“一对多”关系的数据结构——树(Tree)。
树结构分为二叉树和三叉树等,如下图所示。常用的就是二叉树,因此本节以二叉树为主要介绍对象,二叉树之外的树结构暂且统称为非二叉树。
在这里插入图片描述
树在数据结构中占据重要的地位。对于树结构的学习其实不难,先了解它的概念和性质,然后结合图示去理解,最后亲自动手实现其功能,按照这样的思路去学习,一定可以轻松掌握。

  • 节点:用树存储的每一个数据元素都称为节点;
  • 父节点:也叫双亲节点,某一节点的上一个节点即为其父节点,如在上图中,A是B、C、D的父节点,B是E、F的父节点;
  • 子节点:与父节点相反,在上图中,B、C、D是A的子节点,E、F是B的子节点;
  • 兄弟节点:拥有同一个父节点的若干节点互为兄弟节点,如在上图中,B、C和D 互为兄弟节点;
  • 根节点:每棵非空树有且只有一个根节点,如上图中的A节点;
  • 叶子节点:也叫叶节点,指没有子节点的节点,如图3.18中的C、E、F、G、H和I节点;
  • 空树:没有节点的树就是空树;
  • 子树:只包含该节点某一 子节点下所有节点的树称为该节点的子树,其有左子树(leftsubtree)和右子树(rightsubtree)之分;
  • 森林:拥有若干棵互不相交的树的集合;
  • 度:一个节点拥有的子节点数(子树数);
  • 层次:根节点为第一层,根节点的子节点为第二层,以此类推;
  • 深度:也叫高度,即树中节点层次的最大值;
  • 有序树:有顺序的树,即对哪个节点在左边及哪个节点在右边有明确规定的树;
  • 无序树:没有限制节点顺序的树。

注意:一棵树的度,是树内各节点的度的最大值。

二叉树

下面让我们来了解一下二叉树的相关知识吧。
二叉树的定义很简单:其一,它是有序树;其二,各节点的度(子节点数)均不超2。但是二叉树的功能却不简单。
二叉树又分为普通二叉树、对称二叉树、满二叉树和完全二叉树,如下图所示。由于各种树之间可相互转化,所以按道理它们均可使用顺序存储和链式存储,但鉴于空间使用率,普通二又树和对称二叉树一般使用链式存储。
在这里插入图片描述

1. 普通二叉树

普通二叉树其实就是二叉树,只是为了将二叉树更好地分类,才在这里为其加上“普通”二字,以下简称为二叉树,如下图所示。
在这里插入图片描述

二叉树的性质如下:

  • 二又树的第i层最多有 2 i − 1 2i-1 2i1 个节点;
  • 二又树最多有 2 k − 1 2k-1 2k1个节点,k为该树的深度;
  • 二双树的叶子节点数 n 0 n_0 n0比度为2的节点数 n 2 n_2 n2多1,即 n 0 n_0 n0= n 2 n_2 n2+1。

对于第3个性质,很多人肯定有疑问:看似毫无关联的 n 0 n_0 n0 n 2 n_2 n2,不可能只相差1吧?其实很好证明。我们知道,树的每个节点头上都有一条分路(根节点除外),于是可以得到等式:
总节点数 = 总路数 + 1 总节点数=总路数+1 总节点数=总路数+1
总节点数即 n 0 + n 1 + n 2 ,总路数即 n 1 + 2 n 2 ,于是可得: 总节点数即 n_0+n_1+n_2,总路数即 n_1+2n_2,于是可得: 总节点数即n0+n1+n2,总路数即n1+2n2,于是可得:
n 0 + n 1 + n 2 = n 2 + 2 n 2 + 1 n_0+n_1+n_2=n_2+2n_2+1 n0+n1+n2=n2+2n2+1
化简可得:
n 0 = n 2 + 1 n_0=n_2+1 n0=n2+1

2. 对称二叉树

如果某二叉树根节点的左右子树互为镜像,则称其对称二叉树。或者换个说法,某二又树与其镜像是完全一致的,则称其对称二叉树,如下图所示。
在这里插入图片描述

3. 满二叉树

满二叉树有两种定义;一种是指所有节点的度为0或2的二叉树(要么“后继无人”,要么“一朝双喜”);另一种是指深度为k,节点数为 2 k − 1 2k-1 2k1的二叉树(要么在最底层作叶子节点,要么就得有两个子节点,就像一个标准的三角呢)。这里以第二种定义为准进行介绍,如下图所示。
在这里插入图片描述
满二叉树除了具有普通二叉树的性质之外,还有以下性质:

  • 第i层的节点数为 2 i − 1 2i-1 2i1
  • 满二叉树的节点数必为 2 k − 1 2k-1 2k1,叶子数必为 2 k − 1 2k-1 2k1,k为该树的深度;
  • 满二叉树的深度 l o g 2 ( n + 1 ) log_2(n+1) log2(n+1),n为该树的节点数;
  • 所有节点的度要么为0,要么为2,并且叶子节点均在最底层。

4. 完全二叉树

完全二叉树由满二叉树演变而来。如果二叉树从根节点到倒数第二层为满二叉树,并且最底层的节点均靠左对齐,则这个二又树为完全二叉树。显而易见,满二叉树一定是完全二叉树,如下图所示。
在这里插入图片描述完全二叉树同样具有二叉树的所有性质,并且其深度为 ⌊ l o g 2 k ⌋ + 1 \lfloor log_2k \rfloor +1 log2k+1,k为该树的节点数。

注意: ⌊ ⌋ \lfloor \rfloor 表示向下取整,如 ⌊ l o g 2 4 ⌋ \lfloor log_24 \rfloor log24 ⌊ l o g 2 5 ⌋ \lfloor log_2 5 \rfloor log25均等于2。

如果将完全二又树的节点按照先从上到下再从左到右的顺序进行标号,那就更有意思了:
(1)若i>1,节点i的父节点为节点 ⌊ i / 2 ⌋ \lfloor i/2 \rfloor i/2
(2) 若2i>n,则节点i为叶子节点,n为该树的节点数;
(3)若2i+1>n,则节点;无右子节点,n为该树的节点数;
(4)若节点i有子节点,则其左孩子为 2 i 2i 2i,右孩子为 2 i + 1 2i+1 2i+1
如果用数组来实现已标号的完全二又树,则变成了“推”(Heap)。

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

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

相关文章

深度学习(5)--Keras实战

目录 一.Keras基础概念 二.如何跑通Keras项目 2.1.在cmd上跑通 2.2.在PyCharm上跑通 一.Keras基础概念 Keras是深度学习中的一个神经网络框架,是一个高级神经网络API,用Python编写,可以在TensorFlow,CNTK或Theano之上运行。 …

开发相关的工具及AI算法调研【降本增效】

前置说明: 看各个章节总结即可了解章节调研结果 开发降本增效调研可用工具参考以下几块: 总结 以下是实现软件开发降本增效的主要流程,将调研涉及该过程的可用工具或方法。 1、需求收集和分析 效率从软件项目的最初阶段开始——需求收集和分析阶段。这一阶段经常被忽视…

如何保护电脑数据?电脑数据怎么保护?

电脑会储存大量的重要数据,而为了避免数据泄露,必须要使用专业的方式进行保护。那么,要如何保护电脑数据呢?下面我们就来了解一下。 文件夹加密超级大师 文件夹加密超级大师是一款专业的电脑数据加密软件,拥有强大的文…

医疗天使禅道使用工作流程:优化医疗服务的必经之路

目录 博客前言 医疗天使禅道使用工作流程 一.使用最高管理员账号admin管理组织结构 1.新增用户 产品经理使用禅道 1.创建产品 2.添加产品模块​编辑 3.添加产品计划 4.添加产品需求 5.创建项目 6.设置团队 项目经理使用禅道 1.关联需求 2.分解任务 测试主管使用禅…

Swiper轮播图后端接口实现

mybatis-plus:global-config:db-config:id-type: auto #id生成规则:数据库id自增configuration:map-underscore-to-camel-case: false # 开启驼峰功能auto-mapping-behavior: full # 自动映射任何复杂的结果log-impl: org.apache.ibatis.logging.stdout.StdOutImpl…

200G数据中心:QSFP56和QSFP-DD光模块如何选择?

随着光通信与互联网技术的迅猛发展,网络数据流量的需求呈指数级增长,电信骨干网流量年均增速高达50%至80%。为了应对日益攀升的数据传输需求,光通信速率实现了从10G、25G、40G到当前主流的100G、200G、400G甚至更高规格的持续演进。 在此背景…

Flutter中状态管理选项的比较:利弊探索

Flutter 应用程序开发的一个关键方面是管理状态,这确保了整个应用程序的数据一致性和更新。然而,Flutter 提供了多种状态管理解决方案,每种解决方案都有自己的优缺点。在这篇博客中,我们将探讨 Flutter 中一些流行的状态管理选项&…

TestNG @BeforeClass 注解

目录 那么,这个带BeforeClass注释的方法什么时候执行呢? 如果我们在一个类中放置多个BeforeClass注释方法会发生什么? 在这篇文章中,我们将讨论TestNG中的BeforeClass注释。BeforeClass注释方法将在特定类的测试用例之前运行。…

Linux-共享内存

文章目录 前言一、system V共享内存申请共享内存挂载共享内存删除共享内存挂载删除共享内存 二、示例代码三.运行效果 前言 在这之前我们已经学习了两种进程间通信方式:匿名管道和命名管道。 从我们之前的学习已经知道,想让多个进程间进行通信就需要让他…

Spring框架--Spring入门实验二之依赖注入

目录 引言 1、依赖注入之setter注入 2、依赖注入之构造器注入 3、为类类型属性赋值(依赖注入之对象注入) 4、为数组类型属性赋值 引言 Spring框架中的依赖注入(Dependency Injection,DI)是一种设计模式和编程实践…

前端JavaScript篇之intanceof 操作符的实现原理及实现、为什么0.1+0.2 ! == 0.3,如何让其相等

目录 intanceof 操作符的实现原理及实现为什么0.10.2 ! 0.3,如何让其相等 intanceof 操作符的实现原理及实现 instanceof 是一个用于检查对象是否属于特定类的 JavaScript 操作符。它返回一个布尔值,指示对象是否是特定类的实例或者原型链中是否存在该…

Tensorflow 中的损失函数 —— loss 专题汇总

回归和分类是监督学习中的两个大类。自学过程中,阅读别人代码时经常看到不同种类的损失函数,到底 Tensorflow 中有多少自带的损失函数呢,什么情况下使用什么样的损失函数?这次就来汇总介绍一下。 一、处理回归问题 1. tf.losses…

Vue组件点击事件不触发的问题,添加事件修饰符native解决

目录 一、父组件在子组件上绑定方法,点击不触发 .native是什么? 二、其他事件修饰符 .stop .prevent .capture .self .once .passive 三、子组件触发父组件方法 四、父组件调用子组件方法 一、父组件在子组件上绑定方法,点击不触发…

常见の算法

前言本文主要使用Java 什么,是快乐星球#¥%……什么是算法? 算法是一组完成任务的指令。任何代码片段都可视为算法,但我们主要介绍常见算法 一、引入——二分查找 二分查找是一种算法,其输入是一个有序的元素列表。如…

java获取一段音频/mp3的时长

引言 在日常开发中&#xff0c;经常会遇到产品经理提出一个需求“上传音乐/音频”&#xff0c;而且还得显示出音频的播放时长。那我们直接世界上最简单的实现方案&#xff0c;必须是最简单&#xff0c;多一句啰嗦不准点赞。 How to do 1.提前引入包 <!--视频多媒体工具包…

浏览器实用:禁止浏览器http自动转成https

前言 因为有些网站支持http和https两种协议访问&#xff0c;有些只支持一种协议访问。但根据动态域名安全策略&#xff08;HSTS&#xff09;&#xff0c;只要该域名在浏览器中访问过一次https&#xff0c;那么浏览器将强制使http的请求变为https。 虽然这条浏览器的策略有利于提…

【oshi-core依赖】Java获取计算机的内存信息、磁盘信息、CPU信息

这篇文章,主要介绍Java如何获取计算机内存信息、磁盘信息、CPU信息【知识星球】。 目录 一、获取系统信息 1.1、引入依赖 1.2、SystemInfo类

Flink入门教程

使用flink时需要提前准备好scala环境 一、创建maven项目 二、添加pom依赖 <properties><scala.version>2.11.12</scala.version></properties><dependency><groupId>org.scala-lang</groupId><artifactId>scala-library<…

【蓝桥备赛】最大数组和——前缀和

题目链接 最大数组和 个人思路 一个需要简单操作的前缀和数组&#xff0c;因为需要对价值最大的宝石和价值最小的宝石进行操作&#xff0c;所以肯定少不了进行一个排序。然后&#xff0c;可能就有人想要不使用双指针进行处理&#xff0c;如果最小的两个数之和大于最大的数&a…

携程基于Jira Cloud的敏捷项目管理实践

好的工具可以满足团队在各个成长阶段的管理诉求 实践一&#xff1a;对齐目标/团队OKR/多团队协作战略项目 实践二&#xff1a;以产品为中心的协作框架 实践三&#xff1a;交付团队管理 实践四&#xff1a;和海外子公司对齐&#xff0c;协作