数据结构————2,3查找树(介绍)

2,3查找树简介

个人觉得2,3查找树只是作为B树、B+树和Red-Black树的一个基础吧,它虽然实现起来很困难,但是这种通过降低树高的思想很具有启发性。

一.定义

不同于二叉树,2,3查找树有两种类型的结点:Two-node(2结点),Three_node(3结点)。
2结点:和二叉树的结点一样。
3结点:不同与2结点,3结点可以保存两个key,以及有三个结点指针。
4结点:只是临时做存储的,是插入过渡使用的,可以存储三个key

//3结点的大致代码如下:
class Three_Node{
int key1;
int key2;
Three_Node left;
Three_Node right;
Three_Node middle;
}

2,3查找树的定义如下:
如果不为空,那么:

  • 对于2结点,该节点保存一个key,两个指向左右子节点的指针。左结点是一个2,3结点,左结点所有的值要比key都小,右结点也是一个2,3结点,右结点所有的值都比key要大。
  • 对于3结点,给节点保存两个key和三个指向节点的指针。其左子节点中的所有key值都比结点最小的key值还要小,中间节点的key值在结点两个key值的中间,右子节点的所有key值都比结点最大的key值要大。
  • 如果中序遍历2,3查找树,可以得到一个递增序列。

在这里插入图片描述

查找

首先假设2,3查找树已经构建完毕,且处于平衡状态。下面是基本的查找操作:
和二叉查找树的查找方式类似,要查找value是否在树里。首先将它和root的key进行比较,小于就去其左子树进行递归查找,大于就去其右子树进行递归查找。如果找到的节点为null,则说明没有找到。查找过程如下图:

图源:https://www.cnblogs.com/yangecnu/p/Introduce-2-3-Search-Tree.html

在这里插入图片描述

插入

假设要插入的值为value

插入到2结点:

首先查找到要插入的2结点,得到该节点的key,并将改结点替换为数据为key和value的一个3结点。

图源:https://www.cnblogs.com/yangecnu/p/Introduce-2-3-Search-Tree.html

在这里插入图片描述

插入到3结点

向一个3结点插入需要考虑到非常多的情况

  • 只包含一个3结点在这里插入图片描述
    假设这个树只有一个3结点,要插入s的时候发现没有空间了,首先能想到的是能不能先把s插进去,再进行结构调整。
    最自然的方式是我们假设这个节点能存放三个元素,暂时使其变成一个4-node节点,同时他包含四个子节点。然后,我们将这个4-node节点的中间元素提升,左边的节点作为其左节点,右边的元素作为其右节点。插入完成,变为平衡2-3查找树,树的高度从0变为1。

  • 节点是3结点,父节点是2节点
    在这里插入图片描述
    和第一种情况相似,把新的元素插入到3结点中,将其变成一个临时的4结点,然后将其中间元素提升到父节点中,把父节点变成一个3结点,然后将左右结点调整位置

  • 结点是3结点,父节点也是3节点在这里插入图片描述
    可以类比上面的方法,将该节点拆分后把中间元素提升,这样父节点就变成了一个4结点,只需继续将中间元素提升,直到遇到一个父节点为2节点的并且将其变为3结点。

  • 根节点分裂
    有一种情况就是从根节点到子节点都是3节点的时候,如果要插入新的元素,按照之前的提升方法,根节点就会变为4结点,这时就要讲根节点分裂为两个2结点,然后树高+1。
    在这里插入图片描述

  • 本地转换(4结点的转换)
    将一个4结点查分成2,3结点右6种可能性。root,2结点的左右,3节点的左中右。所有的拆分改变都是本地进行,所以只需要O(1)的时间性能。值得注意的是,只有当root是4结点的时候,拆分才会引起树高的变化。

分析

一个完全2,3查找树如下图,每个叶子节点到根节点的距离都是相等的。在这里插入图片描述
由树的查找方式可以知道查找的时间性能和树的高度息息相关

  • 最坏的情况:所有结点都是2结点,性能为O(log2N)。
  • 最好的情况:所有的节点都是3结点,性能为O(log3N)。
    下图给出了2,3查找树的效率:
    在这里插入图片描述

实现

之前有提到,直接实现2,3查找树比较困难,原因有下:

  • 需要处理多种类型的结点
  • 需要多次比较操作
  • 需要上移拆分4结点
  • 拆分的情况过多
    基于这些缺点,后面又提出了B树和红黑树,其中红黑树实现简单而且效率相比2,3查找树还要高一些。

参考博客:https://www.cnblogs.com/yangecnu/p/Introduce-2-3-Search-Tree.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值