理论基础 —— 索引 —— 2-3 树

【概述】

2-3 树是一种多路查找树,其满足于以下性质:

  • 每个结点都具有两个孩子或三个孩子,具有两个孩子的结点称为 2 结点,具有三个孩子的结点称为 3 结点
  • 2 结点包含一个元素和两个孩子,左子树包含元素小于根结点元素,右子树包含元素大于根结点元素
  • 3 结点包含一大一小两个元素和三个孩子,左子树包含较小元素,右子树包含较大元素,中间子树包含介于两者之间的元素
  • 所有的叶结点都在同一层

如上图,12、48、10、15、24、31 都是 2 结点,{18,33}、{23,30}、{20,21}、{45,47}、{50,52} 都是 3 结点。

当所有的叶结点都处于同一层时,那么这棵树就是树高平衡的,可见 2-3 树是树高平衡的,其能够以相对较低的代价保持树高平衡。

此外,容易从 2-3 树的定义推出树的叶结点个数与树的深度间的关系:

  • 一个高度为 k 的 2-3 树至少有 2^(k-1) 个叶结点,此时每个分支结点都有 2 个孩子,形成一棵满二叉树的形状
  • 一个高度为 k 的 2-3 树最多有 3^(k-1) 个叶结点,此时每个分支结点都有 3 个孩子,形成一棵满三叉树的形状

【查找】

在 2-3 树中,查找一个关键码的过程类似于在二叉排序树中的查找。

在 2-3 树中查找给定值 k 的过程是:

  1. 若 root 是空树,查找失败
  2. 若 k=root->data,查找成功
  3. 对于 2 结点,若 k<root->data,在 root 的左子树进行查找;若 k>root->data,在 root 的右子树进行查找
  4. 对于 3 结点,若 k<root->smallData,在 root 的左子树进行查找;若 k>root->bigData,在 root 的右子树进行查找;否则,在 root 的中间子树进行查找

上述过程一直持续到 k 被找到或者待查找的子树为空,若待查找的子树为空,则查找失败。值得注意的是,当查找失败时,恰好找到了以 k 为键值的新结点在二叉排序树中的插入位置。

以下图为例,要如果查找 24,首先查找根结点,由于 24 大于 smallData=18,小于 bigData 33,那么进入中间子树,在下一层中,同样进入中间分支,到达包含 24 的叶结点。

【插入】

在 2-3 树中,插入一个关键码的过程类似于在二叉排序树中的插入,新纪录同样是插入到叶结点中。

插入过程如下:

1.对于空树,直接插入一个 2 节点

2.找到被插入记录应该插入的叶结点

3.如果应插入位置的叶结点是 2 结点,直接将新纪录插入,将 2 结点升级为 3 结点

4.如果应插入位置的叶结点是 3 结点,则需将其分裂,拆分为两个 2 结点

1)设要插入的叶结点为 L,创建一个新结点 L'

2)L 得到三个关键码中最小的一个,L' 得到三个关键码中最小的一个

3)进行一次提升:将中间的关键码与一个指向 L' 的指针传回父结点,并将被提升的关键码插入父结点

4)如果父结点为 2 结点,那么重复步骤 3

5)如果父结点为 3 结点,那么重复步骤 4 的分裂-提升过程

例如:在下图中插入 14、55

 

1)插入 14 时:从根结点开始查找,到达存储 15 的叶结点,其是一个 2 结点,直接将 14 插入即可

2)插入 55 时:从根结点开始查找,到达存储 {50,52} 的结点,其是一个 3 结点,需要进行分裂,加入 55 后,三个关键码的值为 50、52、55,其中,令中值 52 提升,小值 50 与大值 55 作为父结点的叶结点

【删除】

在 2-3 树中,删除一个结点与插入一个结点相反。

其过程为:

1.所删除的元素位于非叶子的分支结点时,将树按中序遍历后得到的前驱或后继元素,用其补位即可。

2.所删除的元素位于 3 结点时,在该结点删除该元素即可,不会影响整棵树的结构。

3.所删除的元素位于 2 结点时,此时分为四种情况:

1)2 结点的父结点是 3 结点:此时将 3 结点进行拆分,根据删除要删除的元素的大小,将被拆分的点与 3 结点的子树进行合并

 

2)2 结点的父结点是 2 结点,且拥有一个 3 结点的右孩子:将父结点与右孩子一起进行左旋,令父结点的右孩子的较小值成为新的父结点,原先的父结点成为新的左孩子,原先的右孩子的较大值不做改变

3)2 结点的父结点是 2 结点,且拥有一个 2 结点的右孩子:先在不破坏 2-3 树的性质的前提下,将 2 结点的右孩子变为 3 结点的右孩子,然后删除要删除的元素,并将剩下的三个点进行左旋调整。

4)当前树是一个满二叉树:此时删除任意一个结点都会破坏 2-3 树的性质,需要考虑在不改变 2-3 树的顺序的情况下,将 2-3 树的层次减少一层。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值