b树,b+树与红黑树

平衡二叉搜索树

它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。常用算法有红黑树、AVL、Treap、伸展树等。在平衡二叉搜索树中,我们可以看到,其高度一般都良好地维持在O(log2n),大大降低了操作的时间复杂度。

红黑树

每个节点或者是黑色,或者是红色。
根节点是黑色。
每个叶子节点是黑色。 [注意:这里叶子节点,是指为空的叶子节点!]
如果一个节点是红色的,则它的子节点必须是黑色的。
从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点。

插入操作:
1.插入根节点(不需要操作)
2.父节点为黑色(不需要操作)
3.父节点和兄弟节点为红色,祖父节点为黑色,只需要变色,将祖父节点递归检查(原本检查自己)
4.父节点为红色,兄弟节点为黑色,祖父节点为红色,先两次旋转再调整颜色(左旋+右旋)

删除操作:
1.删除只有一个新的根节点(直接删除)
2.父节点为黑色,兄弟节点为红色(先旋转成左左,再删除)
3.父节点为黑色,兄弟节点为黑色(先将兄弟节点换成红色,变成情况2)
4.父节点为红色,自己和兄弟节点为黑色(将父节点变成黑色,兄弟节点变成红色,变成情况2)
5.兄弟节点为黑色,兄弟节点左子树根节点为红色(交换颜色,旋转成为左左)
6.情况2和情况5,调整性质5(将N删掉,用子节点顶替,若子节点为红色,则重绘为黑色)

B树(多叉查找树):

根结点至少有两个子女; 
每个非根节点所包含的关键字个数 j 满足:m/2 - 1 <= j <= m - 1; 
除根结点以外的所有结点(不包括叶子结点)的度数正好是关键字总数加1,故内部子树个数 k 满足:m/2<= k <= m ; 
所有的叶子结点都位于同一层。 

B+树

B+ 树是一种树数据结构,是一个n叉树,每个节点通常有多个孩子,一颗B+树包含根节点、内部节点和叶子节点。根节点可能是一个叶子节点,也可能是一个包含两个或两个以上孩子节点的节点。 
B+ 树通常用于数据库和操作系统的文件系统中。 
NTFS, ReiserFS, NSS, XFS, JFS, ReFS 和BFS等文件系统都在使用B+树作为元数据索引。 
B+ 树的特点是能够保持数据稳定有序,其插入与修改拥有较稳定的对数时间复杂度。 
B+ 树元素自底向上插入。 
 
所有的叶子结点中包含了全部关键字的信息,及指向含有这些关键字记录的指针,且叶子结点本身依关键字的大小自小而大的顺序链接。(而B 树的叶子节点并没有包括全部需要查找的信息) 
所有的非终端结点可以看成是索引部分,结点中仅含有其子树根结点中最大(或最小)关键字。(而B 树的非终节点也包含需要查找的有效信息)

有n棵子树的结点中含有n个关键字;  (B~树是n棵子树有n+1个关键字)

所有的叶子结点中包含了全部关键字的信息,及指向含有这些关键字记录的指针,且叶子结点本身依关键字的大小自小而大的顺序链接。 (B~树的叶子节点并没有包括全部需要查找的信息) 

所有的非终端结点可以看成是索引部分,结点中仅含有其子树根结点中最大(或最小)关键字。 (B~树的非终节点也包含需要查找的有效信息)

B+树的有效内容均在叶子节点,B-树的有效内容不全在叶子节点上
B+树的头指针有两个,一个指向根节点,另一个指向关键字最小的元素,因此B+树有两种遍历的方式:
1.从根节点开始随机查询
2.从最小关键词顺序查询

红黑树和平衡二叉树的区别

1、红黑树放弃了追求完全平衡,追求大致平衡,在与平衡二叉树的时间复杂度相差不大的情况下,保证每次插入最多只需要三次旋转就能达到平衡,实现起来也更为简单。 
2、平衡二叉树追求绝对平衡,条件比较苛刻,实现起来比较麻烦,每次插入新节点之后需要旋转的次数不能预知。
 

在B中,**关键字(Key)** 是指存储在结点中的数值,用于支持查找、插入和删除等操作的核心数据[^3]。每个关键字在结构上不仅起到标识作用,还决定了其子结点所代表的区间范围。 具体来说,在一个非叶子结点中,关键字将该结点所包含的数据划分为若干个区间,并通过对应的子结点指向这些区间的进一步细化结构。例如,如果某个结点的关键字数组为 `[k1, k2, ..., kn]`,那么它的子结点数组 `child` 将会有 `n+1` 个元素,满足以下关系: - `child[0]` 指向的子中所有关键字均小于 `k1` - `child[i]` 指向的子中所有关键字均大于 `k(i)` 且小于 `k(i+1)` (其中 `i < n`) - `child[n]` 指向的子中所有关键字均大于 `k(n)` 这种结构使得B可以高效地进行查找操作:从根结点开始,根据查询关键字当前结点关键字的比较结果选择相应的子结点,直到找到目标关键字或确定其不存在于中[^2]。 此外,B的关键字数量其阶数密切相关,通常设计为尽可能多的关键字以降低的高度,从而减少磁盘IO次数,提高查询性能。然而,由于每个结点可能包含多个关键字及其相关数据,这使得B的查询性能不稳定,尤其是在进行范围查询时需要进行中序遍历,操作较为复杂[^4]。 ### B关键字的特点总结 - 关键字是排序的,便于快速定位。 - 非叶子结点中的关键字作为索引,指导查找路径。 - 叶子结点通常存储实际数据或指向外部文件/记录的指针。 - 每个关键字对应一定范围的值,并控制子的划分。 ### 示例代码:B节点的基本定义 ```cpp struct BTreeNode { bool is_leaf; // 是否是叶子结点 int n; // 当前结点中关键字的数量 std::vector<int> key; // 关键字数组(初始化为大小为n的数组) std::vector<BTreeNode*> child; // 子结点数组(初始化为大小为n+1的数组) BTreeNode(int t) : is_leaf(true), n(0) { key.resize(t - 1); // 假设最大关键字数量为t-1 child.resize(t); // 最多有t个子结点 } }; ``` 此代码展示了如何定义一个基本的B结点结构,其中 `key` 成员变量用于保存关键字,而 `child` 成员变量则保存指向子结点的指针。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值