2-3-4树&&红黑树

一、首先来了解什么是2-3-4树

1.简介

2-3-4属于一种多路查找树,是一种四阶的B树,它的结果有以下特点
(1)所有叶子节点都拥有相同的深度
(2)节点只能是2-节点、3-节点、4-节点节点
(3)元素的排序整体上保持二叉查找树的特性,即父节点大于左子节点,小于右子节点;当节点有多个元素时,每个元素都必须大于他左边的和他的左子树中的元素。

2.三种节点的示意图

(1):2-节点:有两个子树的节点
在这里插入图片描述
(2):3-节点:有三个子树的节点
在这里插入图片描述[15=(10+20)/2]
(3):4-节点:有四个子树的节点
在这里插入图片描述
[15=(10+20)/2];[25=(30+20)/2]

3.构建一颗2-3-4树

2-3-4树中结点添加需要遵守以下规则:
(1)插入都是向最下面一层插入
(2)升元:将插入结点由 2-结点升级成 3-结点,或由 3-结点升级成 4-结点
(3)向 4-结点插入元素后,需要将中间元素提到父结点升元,原结点变成两个 2-结点,再把元素插入 2-结点中,如果父结点也是4-结点,则递归向上层升元,至到根结点后将树高加1;

将1 2 3 4 5 6 7 8 9 10 11 12 构建成一个2-3-4树
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

由于是从下到上进行构建的,所以能够保证所有叶子节点都拥有相同的深度

二、红黑树

1.认识红黑树的特性

(1)每个节点不是红色就是黑色
(2)根节点是黑色
(3)每个叶子节点(NIL节点,空节点)是黑色的
(4)如果一个节点是红色的,则他的子节点必须是黑色的
(5)从一个节点到该节点的所有子孙节点的所有路径上包含相同数目的黑色节点

2.从2-3-4树到红黑树

可以把红黑树看作是2-3-4树的衍生
红黑树是内存最优数据结构
原理:因为 2-3-4树的每一个结点都对应红黑树的一种结构,所以每一棵 2-3-4树也都对应一棵红黑树

方法:把在一起的多个节点根据一定的规则拆分成单个节点

(1)局部拆分(以上面的2-3-4树为例)
在这里插入图片描述

拆分方法:(不同色号的笔记代表各自的节点的颜色)
在这里插入图片描述
(2)有2-3-4树如下:
在这里插入图片描述

以上图为例,按照规则,同时满足红黑树的特点,得到红黑树:
在这里插入图片描述
(3)需要注意的点:
1)如果有需要新插入的节点,新插入的结点颜色为红色,这样才可能不会对红黑树的高度产生影响。
2)2-结点对应红黑树中的单个黑色结点,插入时直接成功(对应 2-结点升元)。
3)3-结点对应红黑树中的黑+红子树,插入后将其修复成 红+黑+红 子树(对应 3-结点升元);
4)4-结点对应红黑树中的红+黑+红子树,插入后将其修复成红色祖父+黑色父叔+红色孩子子树,然后再把祖父结点当成新插入的红色结点递归向上层修复,直至修复成功或遇到 root 结点;
5)2-3-4树中的单个节点(不用拆分的节点)一定是黑色的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Objective-C是一面向对象的编程语言它是基于C语言的扩展虽然Objective-C本身并没有提供红黑树的实现,但可以通过使用Foundation框架中的NSSet类来实现类似红黑树的功能[^2]。 NSSet是Foundation框架中的一个集合类,它可以存储一组无序且唯一的对象。NSSet内部的实现可能使用了红黑树数据结构来提高查询速度。 下面是一个使用Objective-C实现红黑树的示例代码: ```objective-c #import <Foundation/Foundation.h> @interface RedBlackTree : NSObject - (void)insertValue:(NSNumber *)value; - (BOOL)containsValue:(NSNumber *)value; @end @implementation RedBlackTree { NSMutableSet *_set; } - (instancetype)init { self = [super init]; if (self) { _set = [NSMutableSet set]; } return self; } - (void)insertValue:(NSNumber *)value { [_set addObject:value]; } - (BOOL)containsValue:(NSNumber *)value { return [_set containsObject:value]; } @end int main(int argc, const char * argv[]) { @autoreleasepool { RedBlackTree *tree = [[RedBlackTree alloc] init]; [tree insertValue:@5]; [tree insertValue:@3]; [tree insertValue:@8]; NSLog(@"Contains 5: %@", [tree containsValue:@5] ? @"Yes" : @"No"); // 输出:Contains 5: Yes NSLog(@"Contains 7: %@", [tree containsValue:@7] ? @"Yes" : @"No"); // 输出:Contains 7: No } return 0; } ``` 在上面的示例代码中,我们创建了一个RedBlackTree类,它使用NSMutableSet来存储红黑树的节点。insertValue方法用于插入一个值,containsValue方法用于检查某个值是否存在于红黑树中。 请注意,这只是一个简单的示例,实际上红黑树的实现要复杂得多。如果需要更复杂的红黑树功能,建议使用第三方库或自行实现。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值