当前位置:网站首页>2-3查找树
2-3查找树
2022-07-07 05:26:00 【Perkinl】
2-3 查找树(2-3-Search-Tree)
- 2-结点:标准二叉树中的结点称为2-结点(含有一个键和两条链接)。
- 3-结点:包含两个键和三条链接。
定义:一颗2-3查找树或为一棵空树,或由以下结点组成:
2-结点,含有一个键(及其对应的值)和两条链接,左链接指向的2-3树中的键都小于该结点,右链接指向的2-3树中的键都大于该结点。
3-结点,含有两个键(及其对应的值)和三条链接,左链接指向的2-3树中的键都小于该结点,中链接指向的2-3树中的键都位于该结点的 两个键之间,右链接指向的2-3树中的键都大于该结点。
2-3 查找树(2-3-Search-Tree) 操作
一棵完美平衡的2-3查找树中所有空链接到根节点的距离应该都是相同的。
查找
2-3 查找树中的查找与二分搜索树的查找类似。要判断一个键是否在树中,先将它和根结点中的键比较。如果它和其中任意一个 相等,查找命中。否则,根据比较的结果找到指向相应区间的链接,并在其指向的子树中递归继续查找。如果是个空链接,查找未命中。
在如上图所示的2-3树中查找键为2的结点是否存在,过程如下:
在如上图所示的2-3树中查找键为17的结点是否存在,过程如下:
插入
向2-结点中插入新键
要在2-3树中插入一个新的结点,类似于二分搜索树的插入,先进行一次未命中的查找,找到要插入的结点所在的位置,将其挂在树的底部。 但这样一来树就无法保证完美平衡性。使用2-3的主要原因:在插入新的结点之后能够继续保持平衡。
如果未命中的查找结束于一个2-结点,就将这个2-结点替换为3-结点,将要插入的键保存在其中即可。
如果未命中的查找结束于一个3-结点,分析过程如下。
向一棵只含有一个3-结点的树中插入新键
在考虑一般情况之前,先假设我们需要向一棵只含有一个3-结点的树中插入一个新键。这棵树中有两个键,所以在它唯一的结点中 已经没有可插入新键的空间了。为了将新键插入,先临时将新键存入该结点中,形成一个4-结点(含有3个键和4条连接)。创建一个4-结点很方便, 因为很容易将其转化成为一棵由3个2-结点组成的2-3树,其中一个结点(根)含有中键,一个结点含有3个键中的最小者(和根结点的左链接相连), 一个结点含有3个键中的最大者(和根结点的右链接相连)。这棵树即是一棵含有3个结点的二叉查找树,同时也是一棵完美平衡的2-3树,因为其中所有的 空链接到跟结点的距离都相等。插入前树的高度是0,插入后树的高度是1。
向一个父结点为2-结点的3-结点中插入新键
假设未命中的查找结束于一个3-结点,而它的父结点是一个2-结点。在这种情况下需要:在维持树的完美平衡的前提下为新键 腾出空间。 需要像刚才一样构造一个临时的4-结点并将其分解,但此时不会为中键创建一个新结点,而是将其移动到原来的父结点中。
将这次转换看成将指向原3-结点的一条链接替换为新父结点中的原中键左右两边的两条链接,并分别指向两个新的2-结点。 根据假设,父结点中石油空间的:父结点是一个2-结点,插入之后变成了一个3-结点。另外,这次转换也不影响(完美平衡的)2-3树的 主要性质。树仍然是有序的,因为中键被移到父节点中去了;树仍然是完美平衡的,插入后所有的叶子结点到根结点的距离仍然相同。
上述过程是2-3树动态变化的核心,图示展示如下:
向一个父结点为3-结点的3-结点中插入新键
假设未命中查找结束于一个父结点为3-结点的3-结点。依旧需要构造一个临时的4-结点并分解它,然后将它的中键插入它的父结点中。由于父结点也是一个3-结点,插入中间后又形成一个新的临时4-结点,然后在这个节点上进行相同的变换,集分解这个父结点并将它的中键插入的它的父结点中去。推广到一般的情况,就是这样一直向上不断分解临时的4-结点并将中键插到更高层的父结点,直到遇到一个2-结点并将它替换为一个不需要继续分解的3-结点,或者是到达3-结点的根。
图示过程如下:
分解根结点
如果从插入节点到根结点的路径上都是3-结点,根结点最终变成一个临时的4-结点。此时可以按照向一棵只有一个*3-结点的树中插入新键的方法处理这个问题。将临时的4-结点分解为三个2-结点**,树高加1。这次最后的变化仍然保持了树的完美平衡性,因为它变换的是根结点。
图示过程如下:
4-结点的分解
在2-3树中4-结点出现的位置有如下的几种情况。
- 1.根结点
- 2.父结点为2-结点的左子结点或右子节点
- 3.父节点为3-节点的左子节点、中间的子结点或右子结点
下面我们来详细看一下在2-3树中出现上述的位置时如何分解。
情形:
当临时的4-节点出现在根节点:
当临时的4-节点出现在2-结点的左侧:
当临时的4-节点出现在2-结点的右侧:
当临时的4-节点出现在3-结点的左侧:
当临时的4-节点出现在3-结点的中间:
当临时的4-节点出现在3-结点的右侧:
上述的情况中,在变化的过程中,只有当根节点最后为临时的4-节点,此时被分解成为3个2-结点时,整个树的高度才会增加1。除此之外,插入一个结点2-3树的高度还是原来的高度。上述的变化过程中:任何空链接到根节点的路径长度都是相等的。
结论
在一棵大小为N的2-3树中,查找和插入的操作访问的结点必然不会超过lgN。
- 证明:一棵含有N个结点的2-3树的高度在在log2 N和log3 N之间。
边栏推荐
- Interface as a parameter (interface callback)
- Obsidan之数学公式的输入
- 使用 Nocalhost 开发 Rainbond 上的微服务应用
- Infix keyword infix expression and the use of generic extension function in kotlin
- 漏洞复现-easy_tornado
- 在Rainbond中一键部署高可用 EMQX 集群
- XCiT学习笔记
- Avatary's livedriver trial experience
- 云原生存储解决方案Rook-Ceph与Rainbond结合的实践
- Using nocalhost to develop microservice application on rainbow
猜你喜欢
Splunk query CSV lookup table data dynamic query
Give full play to the wide practicality of maker education space
一文了解如何源码编译Rainbond基础组件
Rainbond结合NeuVector实践容器安全管理
Make LIVELINK's initial pose consistent with that of the mobile capture actor
Hisense TV starts the developer mode
Open3d ISS key points
船载雷达天线滑环的使用
buureservewp(2)
Réplication de vulnérabilité - désrialisation fastjson
随机推荐
MES系統,是企業生產的必要選擇
Ebpf cilium practice (1) - team based network isolation
[untitled]
It's too true. There's a reason why I haven't been rich
The use of generics and vararg variable parameters in kotlin
在Rainbond中实现数据库结构自动化升级
漏洞复现-Fastjson 反序列化
Interface as a parameter (interface callback)
雅思考试自己的复习进度以及方法使用【日更版】
Practice of combining rook CEPH and rainbow, a cloud native storage solution
Implement your own dataset using bisenet
柯基数据通过Rainbond完成云原生改造,实现离线持续交付客户
Golang 编译约束/条件编译 ( // +build <tags> )
Complex network modeling (III)
机器人教育在动手实践中的真理
GFS distributed file system
[quick start of Digital IC Verification] 12. Introduction to SystemVerilog testbench (svtb)
[go ~ 0 to 1] obtain timestamp, time comparison, time format conversion, sleep and timer on the seventh day
Complex network modeling (II)
解读创客思维与数学课程的实际运用