Thanks to visit codestin.com
Credit goes to www.scribd.com

0% found this document useful (0 votes)
4 views4 pages

Lab ADSA - 2 B-Tree

Uploaded by

proz25912
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
4 views4 pages

Lab ADSA - 2 B-Tree

Uploaded by

proz25912
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
You are on page 1/ 4

#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

You might also like