2-3树 叶子节点删除

本文不再阐述关于2-3树的定义、节点的插入以及将删除的非叶子节点转换为叶子节点的方法

注意: 本文仅对2-3树 叶子节点的 删除操作 进行分类与讨论

定义:
  • 2-节点: 如果某个节点包含1个权值, 那么我们称之为2-节点, 如果该节点并非叶子节点, 那么它一定包含2个非空子树
  • 3-节点: 如果某个节点包含2个权值, 那么我们称之为3-节点, 如果该节点并非叶子节点, 那么它一定包含3个非空子树

若某一个叶子节点被删除, 导致某个子树的层树减1(或1个节点的子树变为空树), 那么我们可以按如下规则去思考如何维护这个子树的平衡:

  1. 如果这个子树的根节点是3-节点, 能否通过旋转保持2-3树的性质, 同时保持该子树高度不变, 维护这个节点是3-节点
  2. 能否通过旋转保持2-3树的性质, 同时保持该子树高度不变, 维护这个子树的根节点是2-节点, 若该节点原来是3-节点, 那么应该选择哪一个权值作为2-节点的根节点
  3. 如果这个子树的根节点没有父节点(即: 这个子树等价于整个2-3树), 能否使整个2-3树的层数减少1(或变为空树)
  4. 如果这个子树的根节点父节点, 能否使得: 以该根节点的兄弟节点(其父节点的其他子节点)为根的子树的层数减少1, 从而: 以其父节点为根的整个子树层数减少1, 接下来按本规则处理其父节点

下面将定义8种操作(大写字母为节点权值, 小写字母为满足2-3树的子树或空树):

  1. 对于3-节点: 左顺旋、左逆旋、右顺旋、右逆旋
    左顺旋、左逆旋右顺旋、右逆旋
  2. 对于2-节点: 顺旋、逆旋
    顺旋、逆旋
  3. 特殊情况: 二阶化、三阶化
    二阶化、三阶化

情况1

图1
删除任何一个叶子3-节点的中的任意一个权值都非常简单, 直接删除即可

情况2(删除字母A)

图2
1.左逆旋 2.直接删除A (规则1)
结果如下图3所示
图3

情况3(删除字母C)

图4
1.左顺旋 2.直接删除C (规则1)

1.右逆旋 2.直接删除C (规则1)
结果如下图5/图6所示
图5图6

情况4(删除字母D)

图7
情况4是情况2的中心对称, 作者比较懒(没有画图), 请各位读者自行思考删除字母D后的结果

情况5(删除字母C)

图8
1.右逆旋 2.直接删除C (规则1)
结果如下图9所示
图9
该结果可二阶化, 结果如下图10所示 (规则2)
图10

情况6(删除字母A)

图11
1.左逆旋
结果如下图12所示
图12
该结果不满足2-3树的规则, 但是已将情况6转化为情况5

按情况5处理, 可以得到结果如下图13、图14所示 (规则2或3)
图13图14

情况7(删除字母C)

图15
情况7是情况5的中心对称, 作者比较懒(没有画图), 请各位读者自行思考删除字母C后的结果

情况8(删除字母D)

图16
情况8是情况6的中心对称, 作者比较懒(没有画图), 请各位读者自行思考删除字母D后的结果

情况9(删除字母A)

图17
1.二阶化 2.直接删除字母A (规则2)
结果如下图18所示
图18

该结果可逆旋, 结果如下图19所示
图19

情况10(删除字母C)

图20
1.左逆旋 2.直接删除C (规则2)

1.右顺旋 2.直接删除C (规则2)
结果如下图21、22所示
图21图22

情况11(删除字母D)

图23
情况11是情况9的中心对称, 作者比较懒(没有画图), 请各位读者自行思考删除字母D后的结果

情况12(删除字母A)

图24
1.逆旋 2.直接删除A (规则2)
结果如下图25所示
图25

情况13(删除字母C)

图26
情况13是情况12的中心对称, 作者比较懒(没有画图), 请各位读者自行思考删除字母C后的结果

情况14(删除字母A)

图27
现在已经无法通过旋转满足保持该子树高度不变, 所以使用规则4, 然后交给父节点递归处理
结果如下图28所示
图28

情况15(删除字母C)

图29
情况15是情况14的中心对称, 作者比较懒(没有画图), 请各位读者自行思考删除字母C后的结果

若本文有任何错误或纰漏, 欢迎指出

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值