[数据结构]B树的基本定义和操作

B树

B树的定义

  • 多叉搜索树,每个节点最多有M个子树,M-1个关键字
  • 根节点若非唯一节点,则最少有2个子树,即最少有1个关键字
  • 非根节点也非叶子节点的,最少有ceil(M/2)个子树,ceil(M/2)-1个关键字
  • 叶子节点都在树的同一层
  • 每个节点的关键字从小到大排列,充当划分子树的边界
c 复制代码
// B树的结构体如下:
typedef struct _btree_node {
	int *keys;
	struct _btree_node **childrens;
	int num;  // 有多少个关键字

	int leaf; // 是否是叶子节点
} btree_node;

typedef struct _btree {
	struct _btree_node *root;
	int t;  // ceil(M/2)-1,方便B树的分裂和合并操作
} btree;

B树的节点生成和销毁

c 复制代码
btree_node *btree_node_create(int t, int leaf)
{
	btree_node *node = calloc(1, sizeof(btree_node ));
	node->keys= calloc(2*t-1, sizeof(int));
	node->childrens = calloc(2*t, sizeof(btree_node *));
	node->num = 0;
	node->leaf = leaf;
	return node;
}

void btree_node_destroy(btree_node *node)
{
	free(node->keys);
	free(node->childrens);
	free(node);
}

B树的分裂

c 复制代码
void btree_split_child(btree *T, btree_node *x, int idx) {
	btree_node *y = x->childrens[idx];
	int t = T->t;
	btree_node *z = btree_node_create(t, y->leaf);

	for (int i = 0; i < t - 1; i++) {
		z->keys[i] = y->keys[i+t];
	}
	if (y->leaf == 0) {
		for (int i = 0; i < t; i++) {
			z->childrens[i] = y->chiledrens[i+t];
		}
	}
	z->num = t - 1;
	y->num = t - 1;

	for (int i = x->num; i > idx; i--) {
		x->keys[i] = x->keys[i-1];
		x->childrens[i+1] = x->childrens[i];
	}
	x->keys[idx] = y->keys[t-1];
	x->childrens[idx+1] = z;
	x->num += 1;
}

B树的合并

c 复制代码
void btree_merge(btree *T, btree_node *x, int idx) {
	btree_node *y = x->childrens[idx];
	btree_node *z = x->childrens[idx+1];

	int t = T->t;
	for (int i = 0; i < t - 1; i++) {
		y->keys[i+t] = z->keys[i];
	}
	y->keys[t - 1] = x->keys[idx];

	if (z->leaf == 0) {
		for (int i = 0; i < t; i++) {
			y->childrens[i+t] = z->childrens[i];
		}
	}
	y->num += t;
	btree_node_destroy(z);

	for (int i = idx + 1; i < x->num; i++) {
		x->keys[i-1] = x->keys[i];
		x->childrens[i] = x->childrens[i+1];
	}
	x->num -= 1;
}
相关推荐
心抵鹊1 小时前
归并排序之翻转对(hard)
数据结构·算法
白狐_7984 小时前
408 数据结构|红黑树插入:只记两大类
数据结构
杉氧6 小时前
打破边界(一):实战编写 Android/iOS 原生模块 (Native Modules)
android·react native·前端框架
zttbee6 小时前
vue2的API大白话讲解
前端·vue.js·前端框架
Lost of 程序猿9 小时前
.NET 线程安全集合与并发数据结构深度实战:从 lock 到无锁
数据结构·安全·.net
机器学习之心10 小时前
基于BiGRU-Attention的轴承剩余寿命预测(MATLAB实现):从振动信号到RUL曲线的完整闭环
数据结构·算法·matlab·轴承剩余寿命预测·振动信号·bigru-attention
青梅橘子皮10 小时前
优选算法---专题2(滑动窗口)
数据结构·算法
百万运营Pro10 小时前
用 Astro + Supabase 从零构建全网盘聚合搜索引擎:PGroonga 中文检索实战
搜索引擎·前端框架·node.js·个人开发·学习方法·ai编程·资源分享
程序猫.10 小时前
双指针问题
java·数据结构·算法