《黑马程序员》— 2-3查找树

目录

2-3查找树定义

2-3查找树的查找

2-3查找树的插入

向2-结点中插入新键

向一棵只含有一个3-结点的树中插入新键

向一个父结点为2-结点的3-结点中插入新键

向一个父结点为3-结点的3-结点中插入新键

分解根结点

性质


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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值