第七章 查找(中)【BST,AVL,红黑树,B树B+树】

1. 二叉排序树BST

第七章 查找(中)【BST,AVL,红黑树,B树B+树】_第1张图片

1.1 二叉排序树的定义

二叉排序树,又称二叉查找树(BST,Binary Search Tree)
一棵二叉树或者是空二叉树,或者是具有如下性质的二叉树:

  1. 左子树上所有结点的关键字均小于根结点的关键字;
  2. 右子树上所有结点的关键字均大于根结点的关键字。
  3. 左子树和右子树又各是一棵二叉排序树。
    左子树结点值 < 根结点值 < 右子树结点值 , 进行中序遍历,可以得到一个递增的有序序列
    适用范围: 二叉排序树可用于元素的有序组织、搜索

1.2 二叉排序树的查找

1.2.1 算法流程

若树非空,目标值与根结点的值比较;
4. 若相等,则查找成功;
5. 若小于根结点,则在左子树上查找;
6. 否则在右子树上查找;
查找成功,返回结点指针;查找失败返回NULL 。

1.2.2 代码实现

typedef struct BSTNode{
   int key;
   struct BSTNode *lchild, *rchild;
}BSTNode, *BSTree;
 
//在二叉排序树中查找值为key的结点(非递归)
//最坏空间复杂度:O(1)
BSTNode *BST_Search(BSTree T, int key){
   while(T!=NULL && key!=T->key){        //若树空或等于跟结点值,则结束循环
      if(key<T->key)       //值小于根结点值,在左子树上查找
         T = T->lchild;
      else                  //值大于根结点值,在右子树上查找
         T = T->rchild;
   }
   return T;
}
 
//在二叉排序树中查找值为key的结点(递归)
//最坏空间复杂度:O(h)
BSTNode *BSTSearch(BSTree T, int key){
   if(T == NULL)
      return NULL;
   if(Kry == T->key)
      return T;
   else if(key < T->key)
      return BSTSearch(T->lchild, key);
   else 
      return BSTSearch(T->rchild, key);
}

1.3 二叉排序树的插入操作

1.3.1 算法流程

  1. 若原二叉排序树为空,则直接插入结点;否则;
  2. 若关键字k小于根结点值,则递归插入到左子树;
  3. 若关键字k大于根结点值,则递归插入到右子树。
    最坏空间复杂度:O(h)

1.3.2 代码实现

//在二叉排序树中插入关键字为k的新结点(递归)
//最坏空间复杂度:O(h)
int BST_Insert(BSTree &T, int k){
   if(T==NULL){           //原树为空,新插入的结点为根结点
      T = (BSTree)malloc(sizeof(BSTNode));
      T->key = k;
      T->lchild = T->rchild = NULL;
      return 1;                       //插入成功
   }
   else if(K == T->key)               //树中存在相同关键字的结点,插入失败
      return 0;
   else if(k < T->key)                 
      return BST_Insert(T->lchild,k);
   else 
      return BST_Insert(T->rchild,k);
}

1.4 二叉排序树的构造

依次将每个关键字插入到二叉排序树中(不同的关键字序列可能得到同款二叉排序树,也可能得到不同款二叉排序树)

//按照str[]中的关键字序列建立二叉排序树
void Crear_BST(BSTree &T, int str[], int n){
   T = NULL;                     //初始时T为空树
   int i=0;
   while(i<n){
      BST_Insert(T,str[i]);     //依次将每个关键字插入到二叉排序树中
      i++;
   }
}

1.5 二叉排序树的删除

1.5.1 算法流程

先搜索找到目标结点:

  1. 若被删除结点z是叶结点则直接删除,不会破坏二叉排序树的性质;
  2. 若结点z只有一棵左子树或右子树,则让z的子树成为z父结点的子树,替代z的位置;
  3. 若结点z有左、右两棵子树,则令z的直接后继 (或直接前驱) 替代z,然后从二叉排序树中删去这个直接后继(或直接前驱),这样就转换成了第一或第二种情况。
  • z的后继:z的右子树中最左下结点(该节点一定没有左子树)=347x240)
    第七章 查找(中)【BST,AVL,红黑树,B树B+树】_第2张图片第七章 查找(中)【BST,AVL,红黑树,B树B+树】_第3张图片
  • z的前驱:z的左子树中最右下结点(该节点一定没有右子树)
    第七章 查找(中)【BST,AVL,红黑树,B树B+树】_第4张图片第七章 查找(中)【BST,AVL,红黑树,B树B+树】_第5张图片

1.6 查找效率分析

查找长度: 在查找运算中,需要对比关键字的次数称为查找长度,反映了查找操作时间复杂度

  • 若树高h,找到最下层的一个结点需要对比 h 次.
  • 最好情况:n个结点的二叉树最小高度为 ⌊ log ⁡ 2 n ⌋ + 1 \left \lfloor \log_{2}n \right \rfloor+1 log2n+1。平均查找长度= O( log ⁡ 2 n \log_{2}n log2n
  • 最坏情况:每个结点只有一个分支,树高h=结点数n。平均查找长度=O(n)。

1.6.1 查找成功的情况下

第七章 查找(中)【BST,AVL,红黑树,B树B+树】_第6张图片

1.6.1 查找成功的情况下(需补充失败结点)

第七章 查找(中)【BST,AVL,红黑树,B树B+树】_第7张图片

2. 平衡二叉树

第七章 查找(中)【BST,AVL,红黑树,B树B+树】_第8张图片

2.1 基础概念

2.1.1 定义

平衡二叉树(Balanced Binary Tree),简称平衡树(AVL树,G. M. Adelson-Velsky和E. M. Landis))——树上**任一结点的左子树和右子树的高度之差不超过1。**又称自平衡二叉查找树。平衡二叉树必定是二叉搜索树,反之则不一定。
结点的平衡因子=左子树高-右子树高。

  • 平衡二叉树结点的平衡因子的值只可能是−1、0或1
  • 只要有任一结点的平衡因子绝对值大于1,就不是平衡二叉树
  • 左结点小于根节点,右结点大于根节点(或者左大于中大于右)

2.1.2 结点代码实现

//平衡二叉树结点
typedef struct AVLNode{
   int key;         //数据域
   int balance;     //平衡因子
   struct AVLNode *lchild; *rchild; 
}AVLNode, *AVLTree;

2.2 平衡二叉树的插入

2.2.1 过程分析

在插入操作中,只要将最小不平衡子树调整平衡,则其他祖先结点都会恢复平衡。
第七章 查找(中)【BST,AVL,红黑树,B树B+树】_第9张图片

2.2.2 调整最小不平衡子树(四种情况)

第七章 查找(中)【BST,AVL,红黑树,B树B+树】_第10张图片
第七章 查找(中)【BST,AVL,红黑树,B树B+树】_第11张图片

  1. 调整最小不平衡子树(LL)
    LL平衡旋转(右单旋转)。由于在结点A的左孩子(L)的左子树(L)上插入了新结点,A的平衡因子由1增至2,导致以A为根的子树失去平衡,需要一次向右的旋转操作。将A的左孩子B向右上旋转代替A成为根结点,将A结点向右下旋转成为B的右子树的根结点,而B的原右子树则作为A结点的左子树。
    第七章 查找(中)【BST,AVL,红黑树,B树B+树】_第12张图片
  2. 调整最小不平衡子树(RR)
    RR平衡旋转(左单旋转)。由于在结点A的右孩子(R)的右子树(R)上插入了新结点,A的平衡因子由-1减至-2,导致以A为根的子树失去平衡,需要一次向左的旋转操作。将A的右孩子B向左上旋转代替A成为根结点,将A结点向左下旋转成为B的左子树的根结点,而B的原左子树则作为A结点的右子树.
    第七章 查找(中)【BST,AVL,红黑树,B树B+树】_第13张图片
    代码实现
    第七章 查找(中)【BST,AVL,红黑树,B树B+树】_第14张图片
  3. 调整最小不平衡子树(LR):由于在 A 的左孩子(L)的右子树(R)上插入新结点,A 的平衡因子由 1 增至 2,导致以 A 为根的子树失去平衡,需要进行两次旋转操作,先左旋转后右旋转。先将 A 结点的左孩子 B 的右子树的根结点 C 向左上旋转提升到 B 结点的位置,然后再把该 C 结点向右上旋转提升到 A 结点的位置。
    第七章 查找(中)【BST,AVL,红黑树,B树B+树】_第15张图片
    也有可能是插入到C的右子树
    第七章 查找(中)【BST,AVL,红黑树,B树B+树】_第16张图片
  4. 调整最小不平衡子树(RL)
    由于在 A 的右孩子(R)的左子树(L)上插入新结点,A 的平衡因子由 -1 减至 -2,导致以 A 为根的子树失去平衡,需要进行两次旋转操作,先右旋转后左旋转。先将A 结点的右孩子 B的左子树的根结点 C 向右上旋转提升到 B 结点的位置,然后再把该 C 结点向左上旋转提升到 A 结点的位置。
    第七章 查找(中)【BST,AVL,红黑树,B树B+树】_第17张图片
    插入操作导致“最小不平衡子树”高度+1,经过调整后高度恢复,在插入操作中,只要将
    最小不平衡子树调整平衡,则其他祖先结点都会恢复平衡
    第七章 查找(中)【BST,AVL,红黑树,B树B+树】_第18张图片
    第七章 查找(中)【BST,AVL,红黑树,B树B+树】_第19张图片

2.2.3 实战练习

  1. RR型
    第七章 查找(中)【BST,AVL,红黑树,B树B+树】_第20张图片
    第七章 查找(中)【BST,AVL,红黑树,B树B+树】_第21张图片
  2. RL型
    第七章 查找(中)【BST,AVL,红黑树,B树B+树】_第22张图片
    第七章 查找(中)【BST,AVL,红黑树,B树B+树】_第23张图片

第七章 查找(中)【BST,AVL,红黑树,B树B+树】_第24张图片
3. LR型
第七章 查找(中)【BST,AVL,红黑树,B树B+树】_第25张图片
第七章 查找(中)【BST,AVL,红黑树,B树B+树】_第26张图片

2.3 查找效率分析

若树高为h,则最坏情况下,查找一个关键字最多需要对比 h 次,即查找操作的时间复杂度不可能
超过 O(h)
特性
平衡二叉树——树上任一结点的左子树和右子树的高度之差不超过1
平均查找长度
公式

2.4 平衡二叉树的删除

2.4.1 平衡二叉树的删除操作要求:

• 删除结点后,要保持二叉排序树的特性不变(左<中<右)
• 若删除结点导致不平衡,则需要调整平衡

2.4.2 平衡二叉树的删除操作具体步骤:

①删除结点(方法同“二叉排序树”)
第七章 查找(中)【BST,AVL,红黑树,B树B+树】_第27张图片
②一路向北找到最小不平衡子树,找不到就完结撒花
③找最小不平衡子树下,“个头”最高的儿子、孙子
④根据孙子的位置,调整平衡(LL/RR/LR/RL)
孙子在LL:儿子右单旋
• 孙子在RR:儿子左单旋
• 孙子在LR:孙子先左旋,再右旋
• 孙子在RL:孙子先右旋,再左旋
⑤如果不平衡向上传导,继续②
对最小不平衡子树的旋转可能导致树变矮,从而导致上层祖先不平衡(不平衡向上传递)
例1:

  1. 删除
    删除
  2. 找最小不平衡子树
    第七章 查找(中)【BST,AVL,红黑树,B树B+树】_第28张图片
  3. 找最小不平衡子树下,“个头”最高的儿子、孙子
    第七章 查找(中)【BST,AVL,红黑树,B树B+树】_第29张图片
    根据孙子的位置,调整平衡(LL/RR/LR/RL)
    孙子在RR:儿子左单旋
    第七章 查找(中)【BST,AVL,红黑树,B树B+树】_第30张图片
    例2:
    1.删除结点
    第七章 查找(中)【BST,AVL,红黑树,B树B+树】_第31张图片第七章 查找(中)【BST,AVL,红黑树,B树B+树】_第32张图片
    第七章 查找(中)【BST,AVL,红黑树,B树B+树】_第33张图片
    2.一路向北找到最小不平衡子树,找不到就完结撒花
    第七章 查找(中)【BST,AVL,红黑树,B树B+树】_第34张图片
    3.找最小不平衡子树下,“个头”最高的儿子、孙子
    第七章 查找(中)【BST,AVL,红黑树,B树B+树】_第35张图片
    4.根据孙子的位置,调整平衡(LL/RR/LR/RL)
    孙子在RR:儿子左单旋
    第七章 查找(中)【BST,AVL,红黑树,B树B+树】_第36张图片
    5.如果不平衡向上传导,继续②

2.4.3 删除效率

平衡二叉树删除操作时间复杂度=O( l o g 2 n log_{2}n log2n)
D
A,根结点度可以为1,所以错
B,最小元素可以是根节点,有一个左孩子
C,不一定是叶子结点,因为如果插入后不平衡了,可能需要旋转
D,降序序列说明左大于中大于右,最大的元素一定是最左的
D
先按BST插入,也就是按照大小从上到下比较,将关键字插入到叶结点,如果插入后不再平衡,需要旋转一下

3. 红黑树(Red-Black Tree)RBT

3.1 为什么要发明 红黑树?

3.11 效率对比

第七章 查找(中)【BST,AVL,红黑树,B树B+树】_第37张图片

  • 如果二叉排序树完全不平衡,则其深度可达到n,查找效率为O(n),退化为顺序查找。
  • 平衡二叉树 AVL:插入/删除 很容易破坏“平衡”特性,需要频繁调整树的形态。如:插入操作导致不平衡,则需要先计算平衡因子,找到最小不平衡子树(时间开销大),再进行 LL/RR/LR/RL 调整
  • 红黑树 RBT:插入/删除 很多时候不会破坏“红黑”特性,无需频繁调整树的形态。即便需要调整,一般都可以在常数级时间内完成

3.1.2 红黑树与AVL的区别

    红黑树(Red-Black Tree)和AVL树都是自平衡的二叉搜索树,它们在保持树的平衡性和提供高效的插入、删除和查找操作方面有相似的目标。然而,它们在实现上有一些区别:
    平衡性要求:AVL树要求左右子树的高度差不超过1,而红黑树没有明确的高度差限制,它只要求满足红黑树的五个性质即可。

平衡调整操作:AVL树在插入或删除节点后,可能需要进行更多的旋转操作来保持平衡,以满足高度差限制。而红黑树的平衡调整操作相对较少,通常只需要进行颜色变换和旋转。

维护开销:由于AVL树要求更严格的平衡,它的平衡调整操作相对较多,因此在频繁的插入和删除操作时,AVL树可能需要更多的平衡调整,导致维护开销较大。而红黑树的平衡调整操作相对较少,所以在插入和删除操作频繁的情况下,红黑树通常具有更好的性能。

内存占用:AVL树通常需要额外的平衡因子来记录每个节点的高度差,因此占用的内存空间相对较大。而红黑树只需要一个额外的颜色属性来记录节点的颜色,因此在内存占用上相对更优。

3.1.3 适用范围

  • 平衡二叉树:适用于以查为主、很少插入/删除的场景
  • 红黑树:适用于频繁插入、删除的场景,实用性更强

3.2 考试考法

第七章 查找(中)【BST,AVL,红黑树,B树B+树】_第38张图片

  • 红黑树的定义、性质——选择题
  • 红黑树的插入/删除——要能手绘插入过程(不太可能考代码,略复杂),删除操作也比较麻烦,也许不考

3.3 红黑树的定义

第七章 查找(中)【BST,AVL,红黑树,B树B+树】_第39张图片

3.3.1 性质

  • 必须是二叉排序树左子树结点值 ≤ 根结点值 ≤ 右子树结点值,且每个结点或是红色,或是黑色的——左根右;
  • 根节点是黑色的,叶结点 (外部结点、NULL结点、失败结点) 均是黑色的——根叶黑;
  • 不存在两个相邻的红结点(即红结点的父节点和孩子结点均是黑色)——不红红;
  • 对每个结点,从该节点到任一叶结点(为有向图路径只能向下)的简单路径上,所含黑结点的数目相同——黑路同。
    在这里插入图片描述
  • 结点的黑高bh --从某结点出发 (不含该结点)到达任一空叶结点的路径上黑结点总数。
    性质1:从根节点到叶结点的最长路径不大于最短路径的2倍。
  • **性质1证明:**任何一条查找失败路径上黑结点数量都相同,而路径上不能连续出现两个红结点,即红结点只能穿插在各个黑结点中间
    性质2:有n个内部节点的红黑树高度 h ⩽ 2 log ⁡ 2 ( n + 1 ) h\leqslant 2\log_{2}(n+1) h2log2(n+1)

与“黑高”相关的推论

  • 结点的黑高bh --从某结点出发 (不含该结点)到达任一空叶结点的路径上黑结点总数。

1.根节点黑高为 h 的红黑树,内部结点数(关键字)至少有多少个?
回答:内部结点数最少的情况——总共h层黑结点的满树形态
结论:若根节点黑高为 h h h,内部结点数(关键字)最少有 2 h − 1 2^{h}-1 2h1

性质2证明: 若红黑树总高度=h,则根节点黑高 ≥ h / 2 h/2 h/2,因此内部结点数 n ≥ 2 h / 2 − 1 n ≥ 2^{h/2}-1 n2h/21,由此推出 h ≤ 2 log ⁡ 2 ( n + 1 ) h ≤ 2\log_{2}(n+1) h2log2(n+1)

2.根节点黑高为 h h h 的红黑树,内部结点数(关键字)至多有多少个?
回答:内部结点数最多的情况——h层黑结点,每一层黑结点下面都铺满一层红结点。共 2 h 2h 2h层的满树形态
结论:若根节点黑高为h,内部结点数(关键字)最多有 2 2 h − 1 2^{2h}-1 22h1

3.3.2 实例:

第七章 查找(中)【BST,AVL,红黑树,B树B+树】_第40张图片
下面这些选项中,满足“红黑树”定义的是(D )
第七章 查找(中)【BST,AVL,红黑树,B树B+树】_第41张图片
A:不红红 B:跟叶黑 C:黑路同

3.3.3 结点定义

第七章 查找(中)【BST,AVL,红黑树,B树B+树】_第42张图片

3.4 红黑树的查找

与 BST、AVL 相同,从根出发,左小右大,若查找到一个空叶节点,则查找失败

3.4.1 查找效率

红黑树查找操作时间复杂度 = O( l o g 2 n log_{2}n log2n),查找效率与AVL树同等数量级
第七章 查找(中)【BST,AVL,红黑树,B树B+树】_第43张图片

3.4.2 平均查找长度 ASL

查找成功:(1+22+34+43)/ 10 =2.9
查找失败时 (4
5 + 5*6) / 11 = 4.55

3.5 红黑树的插入

3.5.1 插入流程

  • 先查找,确定插入位置(原理同二叉排序树),插入新结点
  • 新结点是根-一染为黑色
  • 新结点非根一一染为红色
    • 插入新结点的父结点是黑色,无需做任何操作,依然满足红黑树定义,插入结束
    • 若插入新结点的父结点是红色,需要调整, ,如何调整:此时爷爷必存在且为黑色,看新结点叔叔的脸色
      • 黑叔:旋转+染色
        • LL型:右单旋,父换爷+染色原父和爷换色(父黑爷红)
        • LR型:左旋变成LL、右旋,儿换爷+染色相当于原结点和原爷换色
        • RR型:左单旋,父换爷+原父和爷换色(父黑爷红)
        • RL型:右、左双旋,儿换爷+染色
      • 红叔:染色+变新
        • 叔父爷染色,父节点和叔节点都变黑,祖父变红,祖父变成当前节点爷变为新结点

注意:插入非根节点应该是红色。
原因:根据红黑树特性之一【任意一节点到每个叶子节点的路径都包含数量相同的黑节点】,红色在父节点(如果存在)是黑色节点时,红黑树的黑色平衡不会被破坏,所以不需要进行自平衡操作。但如果插入节点是黑色,那么插入位置所在的子树黑色节点总是多1,必须做自平衡操作。
空节点也算黑叔

3.5.2插入实例

1.插入根节点20,插入10,5,黑叔LL
第七章 查找(中)【BST,AVL,红黑树,B树B+树】_第44张图片
2.插入30红叔(叔父爷,爷变新)
第七章 查找(中)【BST,AVL,红黑树,B树B+树】_第45张图片
3.插入40黑叔RR
第七章 查找(中)【BST,AVL,红黑树,B树B+树】_第46张图片
4.插入57红叔
第七章 查找(中)【BST,AVL,红黑树,B树B+树】_第47张图片

5.插入新结点3的父结点是黑色,无需做任何操作
第七章 查找(中)【BST,AVL,红黑树,B树B+树】_第48张图片
6.插入2黑叔LL
第七章 查找(中)【BST,AVL,红黑树,B树B+树】_第49张图片
7.插入4红叔
第七章 查找(中)【BST,AVL,红黑树,B树B+树】_第50张图片8. 9.10插入新结点35,25,18的父结点是黑色,无需做任何操作第七章 查找(中)【BST,AVL,红黑树,B树B+树】_第51张图片
11.插入22,红叔(叔父爷·,爷变新)第七章 查找(中)【BST,AVL,红黑树,B树B+树】_第52张图片
12.插入23黑叔,LR第七章 查找(中)【BST,AVL,红黑树,B树B+树】_第53张图片
左旋变成LL
第七章 查找(中)【BST,AVL,红黑树,B树B+树】_第54张图片
右旋
第七章 查找(中)【BST,AVL,红黑树,B树B+树】_第55张图片
儿换爷,儿黑爷红
第七章 查找(中)【BST,AVL,红黑树,B树B+树】_第56张图片
14.插入24红叔第七章 查找(中)【BST,AVL,红黑树,B树B+树】_第57张图片
叔父爷染色,爷变新
第七章 查找(中)【BST,AVL,红黑树,B树B+树】_第58张图片
新结点(原爷)黑叔LR
第七章 查找(中)【BST,AVL,红黑树,B树B+树】_第59张图片
左旋
第七章 查找(中)【BST,AVL,红黑树,B树B+树】_第60张图片
右旋
第七章 查找(中)【BST,AVL,红黑树,B树B+树】_第61张图片
儿换爷,23黑30红
第七章 查找(中)【BST,AVL,红黑树,B树B+树】_第62张图片

3.6 红黑树的删除操作

重要考点:
①红黑树删除操作的时间复杂度 = O(log2n)
②在红黑树中删除结点的处理方式和“二叉排序树的删除”一样
③按②删除结点后,可能破坏“红黑树特性”,此时需要调整结点颜色、位置,使其再次满
足“红黑树特性”。

4. 2-3-4树

4.1 定义

2-3-4树是扩展于二叉树的多叉树,二叉树是一个数据项,两个子节点,234树是最少一个数据项,最多3个数据项,最少2个子节点,最多4个子节点,也就是说2-3-4树当只有一个数据项时非叶子节点有且只有2个子节点,2个数据项时3个子节点,3个数据项时4个子节点,子节点数量可以为2,3,4,所以叫2-3-4树。

运算限制:它是平衡树,有序树,添加操作只发生在叶子节点上

4.2 特性

1.非叶节点数据项和其子节点数量的关系:

  • 有一个数据项的节点总是有两个子节点
  • 有两个数据项的节点总是有三个子节点
  • 有三个数据项的节点总是有四个子节点

即非叶节点的子节点数总是比它含有的数据项多1

2.2-3-4树数据项之间的大小关系
第七章 查找(中)【BST,AVL,红黑树,B树B+树】_第63张图片

  1. 根是child0的子树的所有子节点的关键字值小于key0;
  2. 根是child1的子树的所有子节点的关键字值大于key0并且小于key1;
  3. 根是child2的子树的所有子节点的关键字值大于key1并且小于key2;
  4. 根是child3的子树的所有子节点的关键字值大于key2。
    由于2-3-4树中一般不允许出现重复关键值,所以不用考虑比较关键值相同的情况

3.与红黑树的联系
红黑树就是由234树演变出来的。(红黑树是234树的一种实现),了解了234树才能明白红黑树旋转和颜色变化的底层逻辑。
结点类型
第七章 查找(中)【BST,AVL,红黑树,B树B+树】_第64张图片
红黑树对应关系图示
第七章 查找(中)【BST,AVL,红黑树,B树B+树】_第65张图片
上图中没有画出具体的子结点 仅用虚线框标识了一下子结点的取值范围。
不难看出,只要将红黑树中的红结点向上一提,与父结点合并,就反推出了234树。

4.3 基本操作

4.3.1搜索2-3-4树

从根节点开始搜索,(除非查找的关键 字值就是根,)选择关键字值所在的合适范围,转向那个方向,直到找到为止。
比如对于下面这幅图,我们需要查找关键字值为64的数据项。
第七章 查找(中)【BST,AVL,红黑树,B树B+树】_第66张图片
首先从根节点开始,根节点只有一个数据项50,没有找到,而且因为64比50大,那么转到根节点的子节点child1。60|70|80 也没有找到,而且60<64<70,所以我们还是找该节点的child1,62|64|66,我们发现其第二个数据项正好是64,于是找到了。

4.3.2 插入

新的数据项一般要插在叶节点里,在树的最底层。如果插入到有子节点的节点里,那么子节点的数量就要发生变化来维持树的结构,因为在2-3-4树中节点的子节点要比数据项多1。

5. B树

B树,⼜称多路平衡查找树,B树中所有结点的孩⼦个数的最⼤值称为B树的阶,通常⽤m表示。⼀棵m阶B树或为空树,或为满⾜如下特性的m叉树:

  • 树中每个结点⾄多有 m 棵⼦树,即⾄多含有 m-1 个关键字。
  • 若根结点不是终端结点,则⾄少有两棵⼦树。
  • 除根结点外的所有⾮叶结点⾄少有 ⌈ m / 2 ⌉棵⼦树,即⾄少含有 ⌈ m / 2 ⌉ - 1个关键字。(为了保证查找效率,每个结点的关键字不能太少)
  • 所有的叶结点都出现在同⼀层次上,并且不带信息(可以视为外部结点或类似于折半查找判定树的查找失败结点,实际上这些结点不存在,指向这些结点的指针为空)。

第七章 查找(中)【BST,AVL,红黑树,B树B+树】_第67张图片

m阶B树的核⼼特性:

  • 根节点的⼦树数∈ [ 2 , m ] ∈[2, m]∈[2,m],关键字数 ∈ [ 1 , m − 1 ] ∈[1, m-1]∈[1,m−1]。
  • 其他结点的⼦树数∈ [ ⌈ m / 2 ⌉ , m ] ∈[⌈m/2⌉ , m]∈[⌈m/2⌉,m];关键字数∈ [ − 1 , m − 1 ] ∈[ -1, m-1]∈[−1,m−1]。
  • 对任⼀结点,其所有⼦树⾼度都相同。
  • 关键字的值:⼦树0 < 关键字1 < ⼦树1 < 关键字2 < ⼦树2 <…. (类⽐⼆叉查找树左<中<右)
    B树的⾼度:
    含 n 个关键字的 m叉B树,最⼩⾼度、最⼤⾼度是多少?
    l o g m ( ​ n + 1 ) ≤ h ≤ l o g ⌈ m / 2 ⌉ ​ n + 1 2 ​ + 1 log_{m}(​n+1)≤h≤log_{⌈m/2⌉​}\frac{n+1}{2}​+1 logm(n+1)hlogm/22n+1+1

6. B+树

第七章 查找(中)【BST,AVL,红黑树,B树B+树】_第68张图片
B树和B+树的比较
(1)m阶B树:结点中的n个关键字对应n+1棵子树;
m阶B+树:结点中的n个关键字对应n棵子树。
(2)m阶B树:根节点的关键字数n[1,m-1]。其他结点的关键字数n[[m/2]-1,m-1];
m阶B+树:根节点的关键字数n[1,m]其他结点的关键字数n[[m/2],m]。
(3)m阶B树:在B树中,各结点中包含的关键字是不重复的;
m阶B+树:在B+树中,叶结点包含全部关键字非叶结点中出现过的关键字也会出现在叶结点中。
(4)m阶B树:B树的结点中都包含了关键字对应的记录的存储地址;
m阶B+树:在B+树中,叶结点包含信息,所有非叶结点仅起索引作用,非叶结点中的每个索引项只含有对应子树的最大关键字和指向该子树的指针,不含有该关键字对应记录的存储地址。

第七章 查找(中)【BST,AVL,红黑树,B树B+树】_第69张图片

你可能感兴趣的:(24王道数据结构笔记合集,915考研,数据结构)