二叉树
满二叉树
特性
所有叶子结点都集中在二叉树的最下面一层上,而且结点总数为:2^n-1 (n为层数 / 高度)
完全二叉树
特性
若设二叉树的高度为h,除第h层外,其他各层的节点数都达到最大个数,第h层有叶子节点,并且叶子节点都是从左到右依次排布。(堆为完全二叉树)
平衡二叉树
特性
空树或者左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一颗平衡二叉树。
作用
平衡二叉树最大的作用就是查找,AVL树的查找、插入和删除在平均和最坏情况下都是O(logn)
二叉搜索树
特性
若左子树不空,则左树上所有节点的值均小于或等于它的根节点的值。
若右子树不空,则右树上所有节点的值君大于或等于它的根节点的值。
左右子树也分别为二叉搜索树。
红黑树
特性
首先,红黑树是一个二叉搜索树,它在每个节点增加了一个存储位记录节点的颜色,可以是RED,也可以是BLACK;通过任意一条从根到叶子简单路径上颜色的约束,红黑树保证最长路径不超过最短路径的二倍,因而近似平衡(最短路径就是全黑节点,最长路径就是一个红节点一个黑节点,当从根节点到叶子节点的路径上黑色节点相同时,最长路径刚好是最短路径的两倍)
- 节点是红色或黑色。
- 根节点是黑色。
- 所有的叶子节点都是黑色。
- 红色节点的子节点都是黑色
- 红色节点的父节点都是黑色
- 从根节点到叶子节点的所有路径上不能有 2 个连续的红色节点
- 从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。
为什么需要红黑树
对于二叉搜索树,如果插入的数据是随机的,那么它就是接近平衡的二叉树,平衡的二叉树,它的操作效率(查询,插入,删除)效率较高,时间复杂度是O(logN)。但是可能会出现一种极端的情况,那就是插入的数据是有序的(递增或者递减),那么所有的节点都会在根节点的右侧或左侧,此时,二叉搜索树就变为了一个链表,它的操作效率就降低了,时间复杂度为O(N),所以可以认为二叉搜索树的时间复杂度介于O(logN)和O(N)之间,视情况而定。那么为了应对这种极端情况,红黑树就出现了,它是具备了某些特性的二叉搜索树,能解决非平衡树问题,红黑树是一种接近平衡的二叉树(说它是接近平衡因为它并没有像AVL树的平衡因子的概念,它只是靠着满足红黑节点的5条性质来维持一种接近平衡的结构,进而提升整体的性能,并没有严格的卡定某个平衡因子来维持绝对平衡)。
B树
特性
B树是一个多路搜索树,每个节点可以存储多个关键字和对应的数据
一颗阶数为k(k>=2)的B树具有以下结构特点:
- 根节点至少有1个关键字
- 每个非叶子结点都包含k-1个元素和k个孩子,其中 m/2 <= k <= m ,m为树的高度
- 每个节点中的元素从小到大排列,节点当中k-1个元素正好是k个孩子包含的元素的值域分划
- 所有叶子节点位于相同的层级,并且都是空节点或者包含数据的节点
实际应用
-
文件系统:B树常被用作文件系统的索引结构。它可以有效地管理大量的文件和目录,并支持快速的文件查找和访问。典型的例子包括Unix文件系统中的Inode索引和NTFS文件系统中的MFT(Master File Table)索引。
-
数据库系统:B树是关系数据库管理系统中常见的索引结构之一。它被广泛用于构建数据库中的索引,以加快数据的检索速度。B树的平衡性和高效性使得它适用于存储大量数据的场景,并且能够支持范围查询、插入和删除操作。
-
磁盘和存储系统:B树的结构特点使得它适用于管理存储和磁盘上的数据。B树的节点大小通常与磁盘块大小相匹配,可以减少磁盘访问次数,并提高数据的读写效率。
-
搜索引擎:B树在搜索引擎中用于构建倒排索引,加速文档的搜索和检索。倒排索引存储了词汇表和每个词汇对应的文档列表,B树使得在大规模文档集合中进行高效的关键字搜索成为可能。
B树优缺点
-
B树优点:
高效的查找:B树是一种多路搜索树,可以在具有大量数据的情况下快速查找目标元素。它的高度相对较低,因此查找操作的时间复杂度为O(log n),其中n是元素的数量。
高度平衡:B树在插入和删除操作后能够自动保持平衡,使得树的高度相对稳定。这确保了各个节点之间的平衡性,避免了树的倾斜,提高了整体性能。 -
B树缺点:
结构相对复杂,实现难度较大。
内存占用:B树的节点通常比其他树结构的节点更大,因为它需要存储关键字和子节点的指针。
节点的分裂和合并操作可能导致频繁的磁盘IO操作,影响性能。
B+树
特性
B+树是在B树基础上进行了改进和优化,具有以下结构特点:
- B+树与B树的结构类似,但是所有数据都存储在叶子节点上,而非叶子节点只包含关键字范围(或称为分裂值)和指向子节点的指针。
- 非叶子节点的关键字范围与子节点一致(k = n,k为键树,n为子节点)
- 所有叶子节点使用链表连接形成有序链表,提高了范围查询的效率。
- 非叶子节点的关键字起到索引的作用,可以加速查找操作。
实际应用
-
文件系统:B+树常被用于文件系统的元数据管理,如目录结构和文件索引,B+树可以快速定位和访问文件或目录,同时支持高效的范围查询和顺序访问。
-
关系型数据库(经典MySQL):B+树通常用于关系型数据库的聚集索引和辅助索引。聚集索引决定了数据的物理存储顺序,而辅助索引加快了特定字段的查询速度。
-
文件索引:B+树可以用于文件索引,特别是大规模文件存储系统中。它可以快速定位和访问文件块或数据块,提高文件系统的读写效率。
-
日志结构化存储:B+树被应用于日志结构化存储(Log-Structured Storage)中,例如用于分布式文件系统和分布式数据库系统,B+树的顺序访问性能和范围查询能力使得它适合于处理大量写入操作和高效的数据恢复。
B+树优缺点
-
优点:
高效的范围查询:B+树的叶子节点形成有序链表,使得范围查询操作非常高效。通过遍历叶子节点链表,可以快速获取范围内的数据,适用于诸如区间查询等操作。
顺序访问性能好:由于叶子节点形成有序链表,B+树对于顺序访问的性能较好。可以通过遍历叶子节点链表来按顺序获取数据,适用于排序、分页和顺序遍历等操作。
高度相对较低:B+树的节点可以存储多个关键字,因此相比于其他平衡树结构,B+树的高度相对较低。这降低了磁盘访问的次数,提高了数据的访问效率。
支持大规模数据集:B+树适用于大规模数据集的索引,具有良好的扩展性。它可以有效地处理大量的数据和高并发访问,适合在数据库和文件系统等场景中使用。
有序性:B+树的关键字在节点内部以有序方式存储,这对于范围查询、排序和范围分割等操作非常有利。 -
缺点:
写操作相对复杂:相比于其他树结构,B+树的插入和删除操作可能稍显复杂。因为插入和删除可能触发节点的分裂和合并,需要进行额外的调整操作。
空间开销较大:B+树的节点需要存储关键字和指针,因此在存储空间上会有一定的开销。尤其是对于小规模数据集来说,B+树可能会占用更多的内存空间。
B树与B+树的对比(区别)
关键字位置:在B树中,所有关键字都存储在节点中,并且叶子节点和非叶子节点具有相同的结构。而在B+树中,所有关键字都存储在叶子节点中,非叶子节点只包含关键字的范围和指向子节点的指针。
叶子节点结构:B树的叶子节点存储关键字和对应的数据(或指向数据的指针),而B+树的叶子节点只存储关键字和指向数据的指针。叶子节点通过指针连接形成有序链表,而非叶子节点只包含关键字范围和指向子节点的指针。
范围查询和顺序访问:由于B+树的叶子节点形成有序链表,B+树在范围查询和顺序访问方面具有优势。B树在这些操作上的性能相对较差,需要进行更多的节点访问。
高度:由于B+树的关键字全部存储在叶子节点中,非叶子节点只包含关键字的范围和指向子节点的指针,B+树的高度相对较低。而B树的高度相对较高,因为关键字存储在节点中,非叶子节点和叶子节点具有相同的结构。