Loading

B树B+树基础

二叉搜索树

二叉查找树,也称二叉搜索树、二叉排序树。其定义如下:

要么是一颗空树,要么是具有如下性质的二叉树:

  • 若任意节点的左子树不空,则左子树上所有结点的值小于根节点;
  • 若任意节点的右子树不空,则左子树上所有结点的值大于根节点;
  • 任意节点的左、右字数也分别为二叉搜索树;
  • 没有键值相等的节点;

平衡二叉树

平衡树是二叉搜索树合并构成的新数据结构,所以它的名字取了Tree和Heap各一半,叫做Treap

它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。

平衡因子=若平衡因子的取值为-1、0或1时,该节点是平衡的,否则是不平衡的。

最低不平衡点:若节点x是最低不平衡点,则其所有子节点是平衡的,而x的祖先节点可能是不平衡的。

假设本来这棵树是平衡的,在我们在插入一个结点x以后,导致了这棵树的不平衡。

  • LL,插入的节点 x 为左子树的左孩子
  • LR,插入的节点x为左子树的右孩子
  • RL,插入的节点x为右子树的左孩子
  • RR,插入的节点x为右子树的右孩子

红黑树

红黑树是一种特化的AVL树,都是在进行插入和删除操作时通过特定操作保持BST的平衡,从而获得较高的查找性能。

在二叉查找树的强制要求以外,对于任何有效的红黑树我们增加了如下的额外要求:

  • 结点是红色或黑色。
  • 根节点黑色。
  • 不可能有连在一起的红色节点(每个红色节点的两个子节点都是黑色)。
  • 叶子节点(nil或空节点)是黑色。

image-20220311210734166

这些约束强制了红黑树的关键性质:从根到叶子的最长可能路径不多于最短可能路径的两倍长。结果是这个树大致上是平衡的。

平衡二叉树为了维护树的平衡,在一旦不满足平衡的情况下就要进行自旋,但是自旋会消耗一定的系统资源,因此红黑树在自旋造成的系统开销和减少查询次数之间作了权衡,有时候红黑树并不是一颗平衡二叉树。

红黑树已经是在查询性能上得到了优化,但是索引并没有使用红黑树来最为数据结构存储数据,因为红黑树在每一层上存放的数据内容是有限的,导致数据量一大(海量),树的深度就变得非常大,查询性能会非常查。

B树

​ B树中所有结点中孩子结点个数的最大值称为B树的阶,通常用m表示,从查找效率考虑,一般要求m>=3。一棵m阶B树是一棵空树或者是满足以下条件的m叉树:

  • 每个结点最多有m个分支(子树);

  • 若为根节点且根节点不是叶子结点,则至少要有两个分支;非根非叶结点至少有(m + 1)/ 2个分支;

  • 如果一个结点有n-1个关键字,那么该结点有n个分支。这n-1个关键字按照递增顺序排列;

  • 每个结点的结构为:

    n K1 K2 …… Kn
    P0 P1 P2 …… Pn
    • n是指节点中关键字的个数
    • Ki为该节点的关键字且满足Ki<Ki+i
    • Pi为该节点的孩子结点且满足Pi所指结点上的关键字大于Ki1且小于Ki+1
  • 节点内各关键字互不相等且按从小到大排列

  • 叶子结点处于同一层,可以用空指针表示

image-20220311204802106

B+树

  • 只有叶子结点存放键和值,非叶子结点只会冗余叶子结点的键(只有叶子结点存放数据
  • 相邻叶子结点之间是通过链表指针连起来的,按从小到大排列,提高区间访问速度
  • 查找的时间复杂度约为:O(logm)

image-20220311210028809

posted @   zxhio  阅读(81)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
点击右上角即可分享
微信分享提示