2——3树
2015-12-24 01:10
197 查看
2—3树
在一棵2—3树中: 1.所有的节点都处于同一深度,并且含有1个或者2个关键字 2.一个内部节点(一个不是叶节点的节点),或者 a.含有一个关键字及两个子节点(称之为2—节点)或者 b 含有两个关键字及三个子节点(称之为3—节点)。 3.一个内部节点的关键字(按字典序)处于它的两个相邻子节点的两棵子树的关键字之间。 如果该节点是2—节点,这就是二分搜索树的性质;在一个3—节点里,它的两个关键字将子树的关键字分为三类, 一类是小于较小关键字兼键值,一类介于两个关键字键值之间,还有一类是大于等于较大关键字键值。 注意:“2—节点”中的“2”指的是子节点的个数,而不是关键字的个数。
2—3树的插入
(1)搜索该关键字所属的叶节点,记住路径。 (2)如果有存储空间(也就是说,如果该叶节点只有一个关键字),就将该关键字添加到该叶节点并终止 (3)如果该叶节点不存在存储空间(也就是说,它已然是一个3—节点),则将他分割为两个2—节点———————分别 含有第一个和第三个关键字——————并将中间的关键字由上传递到父节点,从而分开余下的两个关键字。 也就是说,父节点的一个子节点将有两个子节点再加上一个关键字取而代之。【如果不存在父节点,则涉 及到步骤(5)。】 (4)如果父节点原来是一个2—节点,则它现在由一个2—节点变成了一个3—节点,且算法终止。否则,返回步骤(3), 用同样的方法分割其父节点。 (5)这一过程一直沿着该树向上重复,直到容纳一个关键字的空间,否则根节点不得不被分割。
2—3树的删除
(1)如果要删除的某个关键字是在叶节点中,那么将他从叶节点中删除,如果要删除的关键字不在叶节点中,那么该关键字的中序后继就在某个叶节点中; 用他的中序后继代替该关键字并将那个中序后继从其所在的叶节点中删除。 (2)到这一步时,已经从某个节点N中删除了一个关键字。若果N仍含有一个关键字,则算法终止。否则,如果现在节点N不含有任何关键字。 a.如果N是根节点,则删除它。在这种情况下,如果N没有子节点,则树变为空树,否则,如果N有一个子节点,则这个子节点成为根节点。 b.(现在,我们已知N至少有一个兄弟节点。),如果N有一个兄弟节点N',N'紧挨着他的左边或者右边并且含有两个关键字,那么设S是N和N' 的父节点中分开他们的关键字。将S移动至N,并用N'中邻近N的那个关键字取代父节点中S的位置,如果N和N'都是内部节点,那么还需要移动N' 的一个子节点,使之成为N的子节点。N和N'最终每个都只含有一个关键字,而不是0和2,。这样就完成了在此情况下的算法。 c.(现在,我们已知N有一个紧挨着它、在它的左边或者右边的兄弟节点N',该节点只含有一个关键字),设P是N和N'的父节点。 且S是在P中把他们分开的关键字。将S和N'中唯一的一个关键字合并成一个新的3—节点,这个3—节点就取代了N和N'这两个节点; 这样P中的关键字个数和P的子节点个数都减少了一。(如果N和N'都是内部节点,那么他们分别拥有2个和1个子节点,所以新节点拥有3个子节点。) 令N<——P,重复步骤(2)。
相关文章推荐
- 浅谈5.7limit优化
- [ISUX译]iOS 9人机界面指南(二):设计策略
- 高德地图搜索提示获取信息回传activity刷新ui(二)
- 运算符重载的例子
- Eclipse导入Maven工程报异常
- LNMP nginx配置和 php-fpm通道详解
- Maven settings 开源中国 镜像并下载本地仓库
- [ISUX译]iOS 9人机界面指南(一):UI设计基础
- HTTP协议
- 日期的格式,你用得对吗?
- ZOJ 1049 I Think I Need a Houseboat
- Result Maps collection already contains value for xxxMapper.BaseResultMap错误解决办法
- win7配置maven环境变量
- Block的简介和简单原理
- 网络编程:Reactor与Proactor的概念
- 不好好说话版原理(二)ORACLE数据库的连接
- Block在ARC和非ARC中的使用
- 删除linux系统服务
- android的线性布局
- echarts中显示效果option中必有的属性