#include <stdio.
h>
#include <stdlib.h>
#define M 3 // Minimum degree
typedef struct BTreeNode {
int keys[2 * M - 1];
struct BTreeNode *children[2 * M];
int n;
int leaf;
} BTreeNode;
BTreeNode *root = NULL;
BTreeNode* createNode(int leaf) {
BTreeNode* node = (BTreeNode*)malloc(sizeof(BTreeNode));
node->leaf = leaf;
node->n = 0;
for (int i = 0; i < 2 * M; i++) node->children[i] = NULL;
return node;
}
void traverse(BTreeNode* node) {
if (node == NULL) return;
int i;
for (i = 0; i < node->n; i++) {
if (!node->leaf) traverse(node->children[i]);
printf("%d ", node->keys[i]);
}
if (!node->leaf) traverse(node->children[i]);
}
void splitChild(BTreeNode* parent, int i, BTreeNode* fullChild) {
BTreeNode* newChild = createNode(fullChild->leaf);
newChild->n = M - 1;
for (int j = 0; j < M - 1; j++)
newChild->keys[j] = fullChild->keys[j + M];
if (!fullChild->leaf) {
for (int j = 0; j < M; j++)
newChild->children[j] = fullChild->children[j + M];
}
fullChild->n = M - 1;
for (int j = parent->n; j >= i + 1; j--)
parent->children[j + 1] = parent->children[j];
parent->children[i + 1] = newChild;
for (int j = parent->n - 1; j >= i; j--)
parent->keys[j + 1] = parent->keys[j];
parent->keys[i] = fullChild->keys[M - 1];
parent->n++;
}
void insertNonFull(BTreeNode* node, int k) {
int i = node->n - 1;
if (node->leaf) {
while (i >= 0 && k < node->keys[i]) {
node->keys[i + 1] = node->keys[i];
i--;
}
node->keys[i + 1] = k;
node->n++;
} else {
while (i >= 0 && k < node->keys[i]) i--;
i++;
if (node->children[i]->n == 2 * M - 1) {
splitChild(node, i, node->children[i]);
if (k > node->keys[i]) i++;
}
insertNonFull(node->children[i], k);
}
}
void insert(int k) {
if (root == NULL) {
root = createNode(1);
root->keys[0] = k;
root->n = 1;
} else {
if (root->n == 2 * M - 1) {
BTreeNode* s = createNode(0);
s->children[0] = root;
splitChild(s, 0, root);
int i = (s->keys[0] < k) ? 1 : 0;
insertNonFull(s->children[i], k);
root = s;
} else {
insertNonFull(root, k);
}
}
}
// ----------- Deletion (Leaf only)
void deleteKey(BTreeNode* node, int k) {
if (node == NULL) return;
int i = 0;
while (i < node->n && node->keys[i] < k) i++;
if (i < node->n && node->keys[i] == k) {
if (node->leaf) {
for (int j = i + 1; j < node->n; j++)
node->keys[j - 1] = node->keys[j];
node->n--;
printf("Deleted %d from leaf\n", k);
} else {
printf("Deletion for internal nodes not implemented in this simple version.\n");
}
} else if (!node->leaf) {
deleteKey(node->children[i], k);
} else {
printf("Key %d not found\n", k);
}
}
int main() {
int nums[10] = {10, 20, 5, 6, 12, 30, 7, 17, 3, 25};
int dels[3] = {6, 17, 10};
printf("Inserting 10 numbers:\n");
for (int i = 0; i < 10; i++) {
insert(nums[i]);
printf("After inserting %d: ", nums[i]);
traverse(root);
printf("\n");
}
printf("\nNow deleting 3 numbers:\n");
for (int i = 0; i < 3; i++) {
deleteKey(root, dels[i]);
printf("After deleting %d: ", dels[i]);
traverse(root);
printf("\n");
}
return 0;
}
OUTPUT:
Inserting 10 numbers:
After inserting 10: 10
After inserting 20: 10 20
After inserting 5: 5 10 20
After inserting 6: 5 6 10 20
After inserting 12: 5 6 10 12 20
After inserting 30: 5 6 10 12 20 30
After inserting 7: 5 6 7 10 12 20 30
After inserting 17: 5 6 7 10 12 17 20 30
After inserting 3: 3 5 6 7 10 12 17 20 30
After inserting 25: 3 5 6 7 10 12 17 20 25 30
Now deleting 3 numbers:
Deleted 6 from leaf
After deleting 6: 3 5 7 10 12 17 20 25 30
Deleted 17 from leaf
After deleting 17: 3 5 7 10 12 20 25 30
Deletion for internal nodes not implemented in this simple version.
After deleting 10: 3 5 7 10 12 20 25 30