目录
2-3查找树定义
二叉查找树有可能出现如下的极端情形。
为了保证查找树的平衡性,=允许树中的一个结点保存多个键。确切的说,我们将一棵标准的二叉查找树中的结点称为2-
结点(含有一个键和两条链)
,而现在我们引入
3-
结点,它含有两个键和
三条链。
2-3查找树的结点要么是2-结点,要么是3-结点。结点都是左小,右大。
2-
结点: 含有一个键(
及其对应的值
)
和两条链,左链接指向
2-3
树中的键都小于该结点,右链接指向的
2-3
树中的键都大于该结点。
3-结点:
含有两个键
(
及其对应的值
)
和三条链,左链接指向的
2-3
树中的键都小于该结点,中链接指向的
2-3
树中的键都位于该结点的两个键之间,右链接指向的2-3
树中的键都大于该结点。
2-3查找树的查找
要判断一个键是否在树中,我们先将它和根结点中的键比较。如果它和其中任意一个相等,查找命中;否则我们就根据比较的结果找到指向相应区间的连接,并在其指向的子树中递归地继续查找。如果这个是空链接,查找未命中。
2-3查找树的插入
向2-结点中插入新键
如果查找后未找到的节点是一个2-结点,那么只需要将新的元素放到这个2-结点里面使其变成一个3-结点即可。
向一棵只含有一个3-结点的树中插入新键
先临时创建一个4-结点,然后再把中间键作为父节点。
假设2-3树只包含一个3-结点,这个结点有两个键,没有空间来插入第三个键了,最自然的方式是我们假设这个结点能存放三个元素,暂时使其变成一个4-结点,同时他包含四条链接。然后,我们将这个4-结点的中间元素提升,左边的键作为其左子结点,右边的键作为其右子结点。插入完成,变为平衡2-3查找树,树的高度从0变为1。
向一个父结点为2-结点的3-结点中插入新键
将新的元素插入到
3-
结点中,使其成为一个临时的
4-
结点,然后,将该结点中的中间元素提升到父结点即2-
结点中,使其父结点成为一个
3-
结点,然后将左右结点分别挂在这个
3-
结点的恰当位置。
向一个父结点为3-结点的3-结点中插入新键
用两次的4-结点过渡,提升两次中间元素为父结点。
当我们插入的结点是
3-
结点的时候,我们将该结点拆分,中间元素提升至父结点,但是此时父结点是一个
3-
结点,插入之后,父结点变成了4-
结点,然后继续将中间元素提升至其父结点,直至遇到一个父结点是
2-
结点,然后将其变为3-
结点,不需要继续进行拆分。
分解根结点
当插入结点到根结点的路径上全部是3-结点的时候,最终我们的根结点会编程一个临时的4-结点,此时,就需要将根结点拆分为两个2-结点,树的高度加1。
性质
一棵完全平衡的
2-3
树具有以下性质
1.
任意空链接到根结点的路径长度都是相等的。
2. 2-3
树与普通二叉查找树最大的区别在于,普通的二叉查找树是自顶向下生长,而
2-3
树是自底向上生长。
3.
4-
结点变换为
3-
结点时,树的高度不会发生变化,只有当根结点是临时的
4-
结点,分解根结点时,树高
+1
。