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-3树 叶子节点删除2-3树 叶子节点删除
  2. 对于2-节点: 顺旋、逆旋
    2-3树 叶子节点删除
  3. 特殊情况: 二阶化、三阶化
    2-3树 叶子节点删除

情况1

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

情况2(删除字母A)

2-3树 叶子节点删除
1.左逆旋 2.直接删除A (规则1)
结果如下图3所示
2-3树 叶子节点删除

情况3(删除字母C)

2-3树 叶子节点删除
1.左顺旋 2.直接删除C (规则1)
结果如下图5所示
2-3树 叶子节点删除

情况4(删除字母D)

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

情况5(删除字母C)

2-3树 叶子节点删除
1.右逆旋 2.直接删除C (规则1)
结果如下图8所示
2-3树 叶子节点删除
该结果可二阶化, 结果如下图9所示 (规则2)
2-3树 叶子节点删除

情况6(删除字母A)

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

按情况5处理, 可以得到结果如下图12、图13所示 (规则2或3)
2-3树 叶子节点删除2-3树 叶子节点删除

情况7(删除字母C)

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

情况8(删除字母D)

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

情况9(删除字母A)

2-3树 叶子节点删除
1.二阶化 2.直接删除字母A (规则2)
结果如下图17所示
2-3树 叶子节点删除

该结果可逆旋, 结果如下图18所示
2-3树 叶子节点删除

情况10(删除字母C)

2-3树 叶子节点删除
1.左逆旋 2.直接删除C (规则2)

1.右顺旋 2.直接删除C (规则2)
结果如下图20、21所示
2-3树 叶子节点删除2-3树 叶子节点删除

情况11(删除字母D)

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

情况12(删除字母A)

2-3树 叶子节点删除
1.逆旋 2.直接删除A (规则2)
结果如下图24所示
2-3树 叶子节点删除

情况13(删除字母C)

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

情况14(删除字母A)

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

情况15(删除字母C)

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

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