1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125
| #include <stdio.h> #include <stdlib.h> #define SUB_M 3
typedef struct btree_node { int *keys; struct btree_node *childrens[SUB_M * 2]; int num; int leaf; } btree_node;
typedef struct btree { btree_node *root; } btree;
btree_node *btree_create_node(int leaf) { btree_node *node = (btree_node *)calloc(1, sizeof(btree_node)); if (node == NULL) return NULL; node->leaf = leaf; node->keys = (int *)calloc(SUB_M * 2 - 1, sizeof(int)); for (int i = 0; i < SUB_M * 2; i++) { node->childrens[i] = (btree_node *)calloc(1, sizeof(btree_node)); }
node->num = 0; return node; } void btree_destory_node(btree_node *node) { if (node == NULL) return; free(node->keys); for (int i = 0; i < SUB_M * 2; i++) { free(node->childrens[i]); } free(node); }
void btree_split_child(btree *T, btree_node *x, int idx) { btree_node *y = x->childrens[idx]; btree_node *z = btree_create_node(y->leaf); z->num = SUB_M - 1; for (int j = 0; j < SUB_M - 1; j++) { z->keys[j] = y->keys[j + SUB_M]; } if (y->leaf == 0) { for (int i = 0; i < SUB_M; i++) { z->childrens[i] = y->childrens[i + SUB_M]; } } int i = 0; y->num = SUB_M; for (i = x->num; i >= idx + 1; i--) { x->childrens[i + 1] = x->childrens[i]; } x->childrens[i + 1] = z; for (i = x->num - 1; i >= idx; i--) { x->keys[i + 1] = x->keys[i]; } x->keys[i] = y->keys[SUB_M]; x->num++; } void btree_insert(btree *T) { btree_node *r = T->root; if (r->num == SUB_M * 2 - 1) { btree_node *node = btree_create_node(0); T->root = node; node->childrens[0] = r; btree_split_child(T, node, 0); } } void btree_merge(btree *T, btree_node *x, int idx) { btree_node *left = x->childrens[idx]; btree_node *right = x->childrens[idx + 1];
left->keys[left->num] = x->keys[idx]; int i = 0; for (i = 0; i < right->num; i++) { left->keys[i + SUB_M] = right->keys[i]; } if (!left->leaf) { for (i = 0; i < SUB_M; i++) { left->childrens[i + SUB_M] = right->childrens[i]; } } left->num += SUB_M; btree_destory_node(right); for (i = idx + 1; i < x->num; i++) { x->keys[i - 1] = x->keys[i]; x->childrens[i] = x->childrens[i + 1]; } }
int main() { return 0; }
|