1. 树
1.1 2-3树
为了保证二叉查找树的平衡性,允许树中的一个节点保存多 个键。
1.1.1 2-3树的定义
一棵2-3查找树要么为空树,要么满足如下两个条件;
-
2-节点:
含有一个键和两条链,左链指向的
2-3树
中的键都小于该节点,右链指向的2-3树
中的键都大于该节点 -
3-节点:
含有两个键和三条链,左链指向的
2-3树
中的键都小于该节点,中链指向的2-3树
中的键都位于该节点的两个键之间,右链指向的2-3树
中的键都大于该节点
1.1.2 查找
将二叉查找树的查找算法一般化,可以得到2-3查找树的查找算法。判断一个键是否在树中,先在根节点查找是否命中。若命中,则查找结束;若未命中,则根据比较结果找到对应的区间连接,并在连接指向的子树中继续执行查找算法(递归)。如果这个连接为NULL,则查找失败。
1.1.3 插入
1.1.3.1 向2-结点中插入新键
先进行查找,后将键放到未找到的节点上。插入后仍然保证树的平衡状态。如果查找后未找到的节点是一个2-节点,则只需要将新的元素放到这个2-节点里面使其变成一个3-节点即可。
1.1.3.2 向一棵只含有一个3-结点的树插入新键
假设2-3树中只含有一个3-节点,这个节点有两个键,没有空间来插入第三个键。则假设这个节点能存放三个元素,使其暂时成为一个4-节点。将这个4-节点中间的键进行提升,左边的键成为其左子树,右边的键成为其右子树。插入完成后,变回2-3树,树的高度从0到1;
1.1.3.3 向一个父节点为2-结点的3-结点中插入新值
先将节点插入3-节点,使其临时成为一个4-节点。把4-节点的中间元素提升到父节点(2-节点)中。把剩余的键分别挂到父节点恰当的位置。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-spD9mQLh-1627393422343)(resource/1619077308948.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-S3qZ6wzO-1627393422348)(resource/1619077329619.png)]
1.1.3.4 向一个父节点为3-结点的3-结点中插入新键
当插入节点是一个3-节点的时候,将该节点进行拆分,中间元素提升到父节点。由于父节点也是一个3-节点,故父节点也进行拆分,将中间元素向上提升。直到遇到一个2-节点,将其变成一个3-节点后,插入完成。
1.1.3.5 分解根节点
当插入节点到根节点的路径上全部都是3-节点的时候,最终根节点会变成一个临时的4-节点。此时,需要将根节点拆分成两个2-节点,中间的键向上提升成为根节点(2-节点)