[数据结构]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;
}
相关推荐
会编程的土豆2 小时前
【leetcode hot 100】二叉树二叉树
数据结构·算法·leetcode
一直都在5722 小时前
B树和B+树详解
数据结构·b树
墨神谕2 小时前
希尔排序详解
数据结构·算法·排序算法
半瓶榴莲奶^_^2 小时前
优先级队列(堆)
java·数据结构·算法
小樱花的樱花2 小时前
C++引用:高效编程的技巧
开发语言·数据结构·c++·算法
Boop_wu3 小时前
[Java 算法] 归并排序
数据结构·算法·排序算法
今儿敲了吗3 小时前
49| 枚举排列
数据结构·c++·笔记·学习·算法
ChoSeitaku3 小时前
NO.2|数据结构设计|日志封装|DeepSeel接入封装|全量返回实现测试|SSE|流式响应实现测试
java·jvm·数据结构
We་ct3 小时前
LeetCode 67. 二进制求和:详细题解+代码拆解
前端·数据结构·算法·leetcode·typescript