数据结构之2-3 树

1.0 什么是2-3树

2-3 树是具有如下性质的树

  1. 对于每一个结点 他有1 或者2 个关键码
  2. 那么什么时候关键码为 1 个呢? 或者说关键码为 1 个的时候有什么性质呢
  3. 当有一个关键码的时候 这个节点的子树会有两个
  4. 当这个节点的关键码有 2 个的时候 这个节点的子树是3个
  5. 他的所有叶子点都在树的同一层

除了上面外 他还有一些类似二叉排序树

  1. 任意节点的左子树的值小于这个节点第一个关键码的值
  2. 中间子树的值均大于第一个关键码
  3. 如果有右子树的说明有两个关键码,则中间子树的所有节点的值小于第二个关键码的值
  4. 右子树的值均大于第二个关键码的值
  5. 进行删除和添加操作的时候 要进行特殊处理

2-3树的例子

2.0 操作

2.1 查找

同二叉树排序树的查找算法,要查找的值与节点的第一个关键码对比 小于这个节点的第一个关键码则进入左子树进行查找,大于第一个关键码切小于第二个关键码(如果有)则进入中间的子树,大于第二个关键码则进入右子树

然后递归呗 对每个节点都运行上面的算法

2.2 插入

插入也是类似AVL树
比较大小 按2-3树的类似查找操作,像图9-7 那样 假设我们插入的是14
他比12大 因为15的这个节点里只有15这一个关键码 所以14和15 会在同一个节点中

那如果这个节点里有两个关键码怎么办呢?

例如:我们插入 55

他比48大, 所以他会进入 50 52这个节点 这样的话这个节点就会有3个关键码,这是不符合2-3树的

所以这个节点要分裂只保留最大和最小的 也就是50 55 注意这时候这是连个节点 一个节点值是50 另一个是55

52 会进行提升 去回到父节点,就是48 52比48大 所以在右边 这是50这个节点作为父节点的中间子树,55是右子树

如果父节点的关键码也是两个 这时候按照上面的规则接着提升

例如:我们还是在图9-7中插入22

这时候20 21 的结点就会变为 节点20 和节点 22 然后21提升

但是父节点 23 30 也是两个关键码,这时候就因为21 进来了 所以分解为21 30

21的左子树是20 右子树是22 30的结点左子树是24 右子树是31

23接着提升 父节点就会变为 18 23 33

接着分裂为18 33

18的左子树变还是12 右子树是21

33的右子树是48没变,33的左子树是30

提升后的23作为这个2-3树的根结点

他的左子树是18 右子树是33

这是别人写的 中间部分是2-3树的详解 带图的

2.3 删除

这个分3种情况

  1. 删除的叶子结点中包含两个关键码 删除这两个关键码其中之一 这个最简单 直接删除就行
  2. 要删除的结点只有一个关键码,他是这个节点的兄弟节点含有两个关键码,这时候就需要修改父节点并且从兄弟节点借用一个关键码来补充我们要删除的这个节点,同时维护2-3树的特性
    2.1
    对于这个图来说
    2-3树的例子

我们删除24这个节点 这时候首先修改父节点 把父节点的23换成21 然后24不删除变为23

也就是 20 21 这个节点就分类为20 这一个节点了 21变为父节点,23替换24

2.2 如果删除的是10呢?按照下面这个图的思想就欧克了 也就是把兄弟节点由2节点变为3节点

然后按上面的方法删除
这里写图片描述
那是怎么找到 7 8是在一起的呢 就是对这个树进行中序遍历 然后把7的后继节点添加进去

2.3 那我们又会有新疑问 如果3节点的叶子结点进行删除会怎么搞呢?
这里写图片描述

很清楚 拆分这个3节点 也就是图中的 12 14 这个节点 保留14

12和中间节点合并 删除左子树这个节点

假如删除右子树或者中间子树 自己看吧

2.4 如果是一颗满二叉树呢?
那么就减少一下高度 将2-3树层树减少,并将兄弟节点合并到双亲节点中,同时将双亲节点的所有兄弟节点合并到双亲节点的双亲节点中,如果生成了-4节点,再分解4-节点即可
这里写图片描述

图片来源


  1. 从内部节点删除一个数据

就是把这个树用中序遍历方式进行遍历 然后用后继节点的key 代替要删除这个节点的Key 也就是关键码

然后相当于删除了 这个后继节点 然后按照相应的方法 删除这个后继节点

这里写图片描述

本节部分内容来源互联网 如有侵权 留言删除

  • 6
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值