二叉查找树的局限以及2-3查找树的简单介绍

1 二叉查找树的局限

  1. 在大部分情况下,二叉查找树的效率比链表查询效率要高得多,但在最坏的情况下,二叉查找树的性能也很糟糕;

  2. 如下图,依次往二叉查找树中插入9, 8, 7, 6, 5, 4, 3, 2, 1。如果要查找1,查找的效率依然很低,效率低的原因在于这个树并不平衡,全部向左边分支;

  3. 我们希望有一种方法,能够不受插入数据的影响,让生成的树都像完全二叉树那样,那么即使在最坏情况下,查找的效率依旧会很好;

这样便引入了2-3查找树。
在这里插入图片描述

2 2-3查找树

为了保证树的平衡性,我们允许树中的一个结点保存多个键,在2-结点(含有1个键2条链)的基础上,引入3-结点(含有2个键3条链)。

2.1 树的定义

一个2-3查找树要么为空,要么满足下面两个要求:

  • 2-结点
    含有1个键(及其对应的值)和2条链,左链指向2-3树中的键都小于该节点的键,右链指向的2-3树中的键都大于该结点的键。
  • 3-结点
    含有2个键(及其对应的值)和3条链,左链指向的2-3树中的键都小于该结点的键,中链指向的2-3树中的键都位于该结点的两个键之间,右链指向的2-3树中的键都大于该结点的键。
    在这里插入图片描述

2.2 树的查找

判断一个键是否在树中:

  1. 先和根节点的键比较,如果和任意一个相等,命中;
  2. 否则,根据比较的结果找到指向相应区间的链接,并在其指向的子树中递归查找;
  3. 如果最终是空链接,未命中。

在这里插入图片描述

2.3 树的插入

2.3.1 向一个2-结点中插入新键

如果查找后未找到时所在节点是一个2-结点,就将这个新元素放到这个2-结点里使其变成一个3-结点。
在这里插入图片描述

2.3.2 向一个3-结点中插入新键

  1. 如果查找后未找到时所在结点是一个3-结点,暂时使其变成4-结点(3个键4条链接);
  2. 将这个4-结点的中间元素提升,左边的键变成左子结点,右边的键变成右子结点;

在这里插入图片描述

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

  1. 假设该结点能放3个元素,暂时使其变成4-结点(3个键4条链接);
  2. 将这个4-结点的中间元素提升,左边的键变成左子结点,右边的键变成右子结点;
  3. 父节点由2-结点变成3-结点。
    在这里插入图片描述

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

  1. 假设该结点能放3个元素,暂时使其变成4-结点(3个键4条链接);
  2. 将这个4-结点的中间元素提升,左边的键变成左子结点,右边的键变成右子结点;
  3. 父节点由3-结点变成4-结点,然后延续前面的操作,继续将中间元素提升,直到父节点是2-结点或者没有父结点。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.3.5 分解根结点

当根结点最终变成一个临时的4-结点时,需要拆分根结点,同时树高+1。
在这里插入图片描述
在这里插入图片描述

2.4 2-3树的性质

  1. 任意空链接到根结点的路径长度都相等;
  2. 只有当根结点变成临时的4-结点,并分解根结点时,树高才+1;
  3. 二叉查找树自顶向下生长,2-3查找树自底向上生长。

2.5 2-3树的实现

2-3查找树的实现比较复杂,而且在某些情况插入后的平衡操作会使效率降低,但是2-3查找树作为一种重要的概念和思路对于理解红黑树、B树和B+树非常重要。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hellosc01

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值