数据结构中树形结构简介

计算机科学中有很多种树,每种树都适合特定的要求和用途。为了有效地解决问题和创建算法,了解这些不同树结构的属性和应用案例至关重要。

基本树概念
边和节点
节点和边的概念是任何树结构的基础。作为基本的架构组件,可以将节点视为道路网络中的交叉点。每个节点都有数据,并且有可能通过边连接到其他节点,从而产生树的分支。节点充当信息的存储空间,而边则显示这些存储空间之间的连接或链接。

内部节点、叶子和根

  • 树的根,即起源或最高节点,是它的顶峰。
  • 它是所有其他节点的主要祖先,因为它没有父节点。

树叶
  • 没有子节点的节点称为叶节点或外部节点。
  • 与自然界中树的叶子类似,它们存在于树枝的最末端。

内部节点
  • 至少有一个不是叶子的后代的节点称为内部节点。
  • 这些节点连接树的多个分支和级别以构建内部框架。

父母、孩子和兄弟姐妹
亲子关系

  • 父子关系链接树的节点。
  • 具有一个或多个子节点的节点被视为父节点。
  • 另一方面,具有父节点的节点是子节点。

兄弟姐妹
  • 兄弟节点是具有相同父节点的节点。
  • 这些连接在树中创建了家族层次结构,使探索和理解结构化数据的表示方式变得更加容易。


二叉树
二叉树(本质上是一种数据结构)中的每个节点最多可以有两个子节点,通常称为左子节点和右子节点。对于更复杂的树数据结构,这种层次结构就是证明。使用简单的 Python 函数,让我们探索二叉树的起源。

二叉搜索树 (BST)
二叉树是一种序列,其中节点的左子树仅由键小于该节点键的节点组成,右子树仅由键大于该节点键的节点组成。这种特定类型的二叉树称为二叉搜索树(BST)。在 BST 中,搜索、插入和删除节点等功能是高效的。

二叉搜索树中的每个节点最多可以有两个后代,通常称为右子节点和左子节点。 BST 的主要特征是其左子树中的每个成员都小于其右子树中的每个元素,反之亦然。

BST 因其固有的排序特性而适合有效的搜索操作。然而,树内节点的精确配置会影响整体性能。在最坏的情况下,倾斜树将导致退化树,其搜索时间与节点数量成正比。

最优二叉搜索树(OBST)
搜索操作的有效性在数据结构领域至关重要。最优二叉搜索树(OBST)是满足这一需求的基本思想。称为 OBST 的二叉搜索树减少了给定键集的典型搜索时间。这样的树是使用复杂的算法和动态编程技术构建的,它优化了结构以实现快速访问。

认识到树的结构可能会极大地影响搜索操作的性能,因此需要最佳二叉搜索树。当某些键比其他键更频繁地使用时,必须对它们进行排列以使平均搜索时间尽可能短。理想的二叉搜索树通过将经常使用的键定位在更靠近根的位置来利用访问概率,从而缩短平均搜索时间。

OBST 是使用动态规划策略构建的。基本概念是将问题分成更小的组件,解决每个组件,然后整合这些解决方案以创建最佳的解决方案。
子问题识别

  • 通过考虑所有潜在的子树,定义子问题。
  • 将每个键视为给定键集的根,然后将剩余键分为左子树和右子树。

递归关系
  • 创建一个递归关系,其中最佳二叉搜索树的成本以其每个子树的成本来表示。
  • 成本由左子树成本和右子树成本以及连接到键的概率总和组成。

自下而上的解决方案构建
  • 使用动态规划表来跟踪临时结果。
  • 理想的二叉搜索树可以通过从较小的子树逐渐构建来达到。
  • 在找到精确解之前,使用递推关系填充表格。

使用动态规划创建 OBST 的时间复杂度为 O(n 3 ),其中“n”是键的总数。这是因为有必要考虑所有潜在的子树并评估每个子树的所有潜在的根。搜索操作中获得的生产力验证了构建理想树的努力,尽管这在计算上可能显得昂贵。

OBST 通过根据访问概率智能地组织频繁使用的键,确保它们更接近根,从而减少平均搜索时间。动态规划方法系统地创建理想的二叉搜索树,将问题划分为更小、更易于管理的困难,并构建理想的答案。尽管算法的复杂性可能看起来令人生畏,但搜索效率的提高证明了计算支出的合理性。

对于希望创建高性能系统的计算机科学家和软件工程师来说,理解和使用最佳二叉搜索树至关重要。 OBST 的研究在更大的计算机科学领域中是一项值得努力的事情,因为随着技术的发展,高效的算法和数据结构对于软件开发至关重要。


AVL 树:自平衡二叉搜索树
AVL 树是一种特殊的自平衡二叉搜索树。 AVL 树的任意两个子子树之间的高度差限制为 1。如果在插入或删除操作期间任何时候违反此属性,则会进行轮换以恢复平衡。

平衡二叉搜索树:红黑树
红黑树是另一种具有独特特性的自平衡二叉搜索树。这些特性保证了搜索、插入和删除操作的对数时间复杂度,同时确保树在插入和删除过程中保持平衡。

KD树
KD 树,也称为 K 维树,是多维空间中点组织的重要数据结构,通常当 K 表示相当高的数字时。这些结构的吸引力在于它们能够促进多维空间领域中的多种搜索方法,包括范围搜索和最近邻搜索。

二叉树中的每个节点都是“KD树”的表现形式,对应于K维空间中的一个点。空间本身通过超平面分为两个领域,树中的每个非叶节点都体现了超平面。对应于 K 个维度之一的所选轴将自身平行于这些超平面对齐。

轴的选择可以通过各种方法来实现,但最传统的方法需要在定义中点以执行空间划分之前顺序循环通过每个 K 维度。

解锁 KD 树的机制
从本质上讲,KD 树作为二叉树运行,每个节点代表一个 k 维点,从而将空间分为两个不同的半空间。下面是对该过程的更仔细的检查:

  1. 维度选择:初始步骤围绕维度的选择。在 2D KD 树中,x 和 y 维度之间会发生切换过程,而在更高维度中,它会在坐标之间循环。
  2. 发现中位数:在选定的维度内,通过评估该特定维度内的值来揭示中位数。该中点随后将王座作为树的根节点。
  3. 划分区域:数据集被分割为两个子集,一个是位于中线一侧的点的所在地,另一个是位于另一侧的点的所在地。这些子集与根节点的左子树和右子树建立连接。
  4. 递归展开:步骤 1 到 3 进入递归领域,因为每个子树都会重复该过程。结果是一个树结构,其中每个节点都体现了不同维度内的中点。

完美二叉树
完美二叉树,通常称为完全二叉树,是一个令人着迷的主题,吸引了计算机科学家、数学家和自然爱好者。由于其对称结构和递归性质,它们是一个令人着迷的研究课题,并且它们在从计算机科学到语言学等领域都有广泛的用途。

一种特殊的二叉树表现出令人难以置信的对称性和平衡性,被称为完美二叉树。要使二叉树被认为是完美的,必须满足两个基本要求:

  • 树的每一层都有带有零个或两个子节点的节点,这意味着它已被填充。
  • 所有叶子(没有子节点的节点)的深度或级别都是相同的。

完美二叉树与其他二叉树版本的区别在于其固有的对称性。将完美的二叉树视为黄金比例的生动例证,即美丽而自然的和谐。这棵树看起来是其自身的和谐反映,因为对称结构确保每个节点都有左右子节点。

除了视觉上吸引人之外,完美二叉树对于不同的算法和数据结构来说,在时间和空间复杂度方面都具有相当大的优势。这些树的平衡结构优化了搜索过程,使其准确且高效。这种对称特征构成了各种基本思想和应用的基础,并且它为研究基于树的算法和数据存储领域提供了独特的机会。

完美二叉树显示出一些在实际应用中既有趣又有用的特征。让我们来看看其中一些显着特征:

  • 高度:完美二叉树的一个重要组成部分是它的高度。具有“h”层的树的最后一层(叶子)上的节点数为 2(h-1),树中的节点总数为 2(h-1)。这种连接使得有效地平衡完美二叉树成为可能。
  • 节点数:完美二叉树中的节点数为 2h - 1,其中“h”表示树的高度。这种基本技术可以快速准确地确定给定高度的完美二叉树中有多少个节点。
  • 深度和级别:完美二叉树中的每个节点都有两个属性,称为深度和级别。深度是节点与根的距离的度量,而级别是深度乘以一。根节点的级别和深度均为 0。完美二叉树在每个深度或级别都有叶节点。
  • 平衡设计:正如已经确定的那样,完美的二叉树具有良好的平衡设计。这种平衡减少了树的最大深度,产生了对不同算法始终有效的结构。

完美二叉树在各个领域都有许多实际用途,因此它们的受欢迎程度不仅仅是它们的外观和理论特征。以下是完美二叉树的一些值得注意的用途:

  • 二叉搜索树: BST 是用于有效元素绑定、插入和删除的基本数据结构。在完美二叉树中,其中“n”是节点数,精心构建的二叉搜索树可以为这些操作提供 O(log n) 时间复杂度。
  • 堆数据结构:完美二叉树可用于有效地创建堆,这对于实现优先级队列和各种排序算法是必需的。堆的基础是完整二叉树,它是完美二叉树的子类,可提供快速元素插入和检索。
  • 语言学中的语法树:自然语言中句子和表达的结构在语言学研究中用语法树来表示。为了使语言组件的解析和分析更简单,这些树经常采用完美的二进制形式。
  • 数字的二进制表示:计算机系统中采用完美二叉树来有效表示和操作二进制数。这对于计算机体系结构特别有用,因为操作和存储数据是基于二进制表示的。
  • 压缩算法:二叉树通常具有完美的二叉树特征,在广泛使用的压缩过程霍夫曼编码中采用,以有效地编码和解码数据。
  • 人工智能中的游戏树:在人工智能中,游戏树描述了国际象棋和井字棋等棋盘游戏中的潜在动作和结果。为了简化决策过程,这些树经常被构建为完美二叉树。
  • 文件系统:为了维护有效的数据结构并允许快速信息检索,用于组织和访问存储设备上的数据的 B 树和 B+ 树等文件系统使用完美二叉树的概念。
  • 数据序列化:是将数据结构或对象转换为适合计算机科学中存储或传输的格式的过程。可以有效地利用完美二叉树来加速这个过程。

N叉树
N 叉树是每个节点可以有多个后代的树结构。 “N 元”一词表示一个节点最多可以有“N”个子节点,其中“N”是表示此限制的变量。 N 叉树提供了比二叉树更具适应性的结构,二叉树只允许每个节点有两个子节点。

应用领域

  • 文件系统: N 叉树经常用于对文件系统进行建模。 N 叉树结构非常适合目录,因为每个目录都可以包含任意数量的文件或子目录。
  • 组织结构图: N 叉树可以显示商业或教育环境中的组织层次结构。节点的直接下属由其子节点表示,可以是员工或部门。
  • 抽象语法树(AST): AST 描述了编译器设计中程序代码的层次结构。为了表示各个代码段之间的连接,可以使用n叉树。
  • 家谱: N 元树是描绘家谱或家谱的常见方式。每个个体都是一个节点,节点的后代是其后代的代表。
  • XML 和 HTML 文档结构: XML 和 HTML 页面的文档对象模型 (DOM) 通常被描述为 N 叉树。 XML 和 HTML 文档结构。文档的元素都是节点;嵌套元素是节点的子元素。

多路树
在计算机科学和信息技术中,多路树(也称为多叉树或通用树)是数据结构的基本类型。它们提供了一种灵活的方法来描述层次结构,并用于各种上下文,包括文件系统、数据库和解析器树。

称为多路树的树数据结构允许每个节点有多个后代。多路树可以有多个子节点,与二叉树相反,二叉树的每个节点最多只能有两个子节点。由于其灵活性,它们非常适合对复杂的层次关系进行建模。

多路树的主要特征包括:

  • 节点结构:多路树中的每个节点都有许多指向其子节点的指针。从节点到节点,指针的数量可能不同。
  • 根节点:根节点是树的起点,可以从根节点访问所有其他节点。
  • 叶节点:没有子节点的节点称为叶节点。多路树中的叶节点可以有任意数量的子节点,甚至可以是零。
  • 高度和深度:多路树具有高度(树的最大深度)和深度(从根到节点的距离)。由于孩子数量的不同,树的深度和高度可能会有很大差异。

多路树的类型:
多路树有多种形式,每种形式都有特定的属性和用途。最典型的品种包括:

  • 通用多路树:这些树中的每个节点都可以有无限数量的后代。它们被广泛应用于各种应用中,例如公司组织层次结构和文件系统中的目录结构。
  • B 树:在文件系统和数据库中,B 树是一种自平衡多路树。它们对于插入、删除和搜索非常有效,因为它们是为了保持平衡的结构而设计的。
  • 三元树:一种特殊的多路树,其中每个节点恰好有三个子节点,称为三元树。它们经常被纳入优化和语言处理方法中。
  • 四叉树和八叉树:这是地理信息系统和计算机图形学中用于空间分割和索引的专用多路树的两个示例。八叉树每个节点有八个子节点,而四叉树有四个子节点。

多路树上的操作:
多路树支持多种操作,允许有效的数据修改和检索。以下是一些基本操作的示例:

  • 插入:向树添加新节点,同时确保它保留树的结构和特征。
  • 删除:从树中删除节点,同时仍保留其完整性。
  • 搜索:使用搜索在树中查找特定节点或值。
  • 遍历:遍历是按照特定顺序(例如前序、中序或后序)遍历树中每个节点的过程。
  • 平衡(对于 B 树):为了保持快速搜索和检索时间,平衡(对于 B 树)涉及确保树在插入和删除后保持平衡。

多路树的意义:
由于以下原因,多路树在数据结构和计算机科学中非常重要。

  • 多功能性:多路树可用于广泛的应用程序,因为它们提供了一种描述层次关系的通用方法。
  • 效率:为了管理和组织数据库和文件系统中的大量数据集,某些类型的多路树(例如 B 树)是为了提高效率而构建的。
  • 解析和语法树:多路树对于编译器和解释器至关重要,因为它们用于编程语言的解析和语法分析。
  • 空间数据结构:多路树,例如四叉树和八叉树,允许在地理信息系统和计算机图形中进行有效的空间索引和分区。

多路树是一种灵活且重要的数据结构,具有多种应用。在计算机科学和信息技术的许多领域,它们能够描述每个节点具有可变数量的后代的层次关系,这使得它们非常有用。多路树是导出难题解决方案和优化数据操作的重要工具,无论它们是用于数据库中的有效数据存储、编译器中的解析还是图形中的空间分区。任何处理分层数据结构的计算机科学家或软件工程师都必须对其特征、种类和操作有深入的了解。

后缀树
在数据结构领域,我们遇到称为“后缀树”的实体。这个复杂的构造的目的是保护字符串集合。在这种情况下,合并中的独特后缀会聚成这个复杂集群中的单个节点或主分支。

尽管构建后缀树有许多不同的方法,但大多数后缀树(如果不是全部)都共享以下语义:

  • 每个子字符串都添加了一个额外的特殊字符。
  • 每个叶节点所代表的后缀的索引或起始位置都包含在其中。
  • 每个后缀的字母都被压缩为单个节点表示。

在学习后缀树之前,了解 trie特里树 和后缀树之间的区别至关重要。

特里树
在数据结构领域,“trie特里树”展现了其复杂性,因为它秘密地分隔了其指定数组中所有字符串的每个字符。这种仔细的选择,以单个节点的存在来表示,使其有别于传统的结构。当一个公共子串开始多个单词时,就会出现一个统一的节点链来封装这个共享的语言片段。

链在子字符串结束处优雅地解散,优雅地让位于独特后缀的开始。因此,这些独特后缀的每个字符都通过构成特里树复杂结构的离散且专门的节点找到其表示。

后缀树的功能
如果符号源自包含从负无穷大到正无穷大的多项式范围的整数字母表,则可以在以下方式中完成表示为“S”的字符串的后缀树的构造,该字符串表示为“S”,长度表示为“n”时间复杂度为 Theta (n)。在处理固定尺寸的字母表时尤其如此。然而,对于更广泛的字母表,相当一部分时间资源被分配给将符号组织成大小为 O(n) 的范围的任务,该过程通常需要 O(nlog n) 时间。
假设存在在字符串“S”上建立的长度为“n”的后缀树,可以执行以下操作:
1. 搜索字符序列:-

  • 在 O(m) 的时间范围内,可以确定长度为“m”、标记为“P”的字符序列是否符合子串的条件。
  • 在 O(m) 的时间范围内,可以识别累积长度为“m”的序列“P1...PQ”的初始出现作为子串。
  • 在 O(m+z) 的时间范围内,可以精确定位子串内长度为“m”的模式“P1...PQ”的所有“z”次出现。

2. 识别字符序列的特征:-
  • 在Theta(n(i) + n(j))的时间范围内,可以确定字符串'S(i)'和'S(j)'之间共享的最广泛的公共子串。
  • 在 Theta (n + z) 的时间范围内,所有最大配对、最大重复和超最大重复都可以被揭示。
  • 在 Theta (n) 的时间范围内,可以识别最长的重复子串。
  • 在Theta(n)的时间范围内,可以辨别只出现一次的最小长度的子串。

此外,后缀树可以应用于生物信息学、编辑和自由文本搜索等应用中的各种字符串挑战。以下是一些最流行的用途的列表:

  1. 精确的字符串对应:如前所述,在给定文本的后缀树中,模式 P 的全部出现可能会以 O (P + occ) 的时间复杂度被发现。即使考虑到构建后缀树的时间投入,这种方法也渐近地与 Knuth-Morris-Pratt 的效率相媲美,特别是在处理多种模式时。
  2. 计算基因组学:后缀树在生物信息学领域得到广泛应用,特别是用于识别 DNA 链内重复出现的基序。此外,它们对于揭示 DNA 序列中最长的公共子串或子序列具有无价的价值。这些技术在进化生物学和识别生物体之间共享遗传特征的领域中至关重要。
  3. 文本度量:后缀树中的每个节点都明确对应于一个文本因素,相反,每个因素都与一个唯一的节点相关。因此,即使产生的值传统上遵循 Theta(n^2),文本中不同因素的总分类等于独特节点的数量,该数量可以在线性时间 O(n) 中计算,如下所示:系统地遍历后缀树。文本中最长的循环因子表示至少重复两次的最扩展的序列,它由后缀树的最里面的节点简洁地表示。
  4. 最高回文序列:回文是一个在反转时保持不变的序列的缩影,如“赛车”一词所示。后缀树领域内的这一概念是识别最扩展回文序列的宝贵工具。
  5. 数据缩减策略:在信号处理领域,数据压缩封装了使用比其初始表示更少的比特来编码信息的技术。

结论
树因其表达层次关系、有效搜索和检索数据以及适应专门应用的天然能力而成为计算工具箱中的适应性工具。树在众多领域的流行强调了它们对计算机科学的重要性。树对于创建有效的算法和结构至关重要,无论是用于管理文件系统中的层次关系、使用霍夫曼树压缩数据还是优化搜索过程。树也是计算机科学中必不可少的构建块,由于它们对各种应用的适应性以及保持平衡以实现最佳性能的功能,为高效和有效地解决问题铺平了道路。