2-3树
2-3树的基本定义
2-3树的意思就是说,一个父节点可以有两个子节点,也可以有三个子节点,并且其也满足类似二叉搜索树的定义(父节点的值大于左子树,但小于右子树),所有叶子节点都在同一层。
2节点:父节点存储一个值,最多有左右两个子树。假设父节点为p,子节点为l(左节点)、r(有节点),且满足:l < p < r
3节点:父节点存储两个值,最多有左中右三个子树。假设父节点分别为p1,p2,子节点分别为l(左节点)、m(中间节点)、r(右节点),且满足:l < p1,p1 < m < p2,r > p2
节点分裂与合并
节点分裂:若三节点插入一个值后变为了4结点那就需要结点分裂,分裂就是将中间的值作为单独的结点,然后让两边的值分别变为它的孩子。如图所示:
节点合并:分裂过后,让中间的结点和之前父亲节点进行合并,如图所示:
2-3树的插入
- 待插入节点为2节点
如果不能直接放到空的子节点,则放到父节点中,此时成为3节点,仍然满足定义。 - 待插入节点为3节点
插入节点后,待插入节点变为4节点,因此需要进行分裂,并且与父节点进行合并,若分裂过后的父节点满足定义则完成插入,若父节点也变为4节点则需要继续将父节点分裂并且与爷爷节点合并,直到所有节点满足定义插入结束。
2-3树的删除
因为要保证删除节点后所有的空节点能够尽量保持在同一层,所以要进行调整。
- 删除节点在叶子节点
- 删除节点为3节点:
直接删除相应的值即可 - 删除节点为2节点:
- 该节点的兄弟节点为3节点、双亲节点为2节点:
将双亲节点移动到当前位置,并且再将兄弟节点中最接近当前位置的key移动到双亲节点中 - 该节点的兄弟节点为2结点,双亲节点为3节点:
此时兄弟节点不够借,父节点降元,从3节点变成2节点,与兄弟节点合并。 - 该节点的兄弟节点、双亲节点都为为2节点:
将父节点和兄弟节点合并,形成新的节点,这是把新节点当做当前节点,不断套用上述几种情况进行调整,直至平衡。
- 该节点的兄弟节点为3节点、双亲节点为2节点:
- 删除节点为3节点:
- 删除节点为非叶子节点:
中序遍历找到该节点的直接前驱或者直接后继,将该节点与该节点进行交换,然后删除交换后的叶子节点,再按照删除叶子节点的方法去调整
全文参考于:从2-3树理解红黑树,该文章文图并茂,这里只做笔记,详情点进去自己看哦。