TawratNibir

b+ tree

May 20th, 2026
44
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.13 KB | None | 0 0
  1. #include <iostream>
  2.  
  3. const int M = 3;
  4.  
  5. struct Node
  6. {
  7.     bool isLeaf;
  8.     int numKeys;
  9.     int keys[M];
  10.     Node *children[M + 1];
  11.     Node *next;
  12.  
  13.     Node(bool leaf)
  14.     {
  15.         isLeaf = leaf;
  16.         numKeys = 0;
  17.         next = nullptr;
  18.         for (int i = 0; i < M + 1; i++)
  19.         {
  20.             children[i] = nullptr;
  21.         }
  22.     }
  23. };
  24.  
  25. void splitChild(Node *parent, int index, Node *child)
  26. {
  27.     Node *newNode = new Node(child->isLeaf);
  28.     int median = M / 2;
  29.  
  30.     if (child->isLeaf)
  31.     {
  32.         newNode->numKeys = M - median;
  33.         for (int i = 0; i < newNode->numKeys; i++)
  34.         {
  35.             newNode->keys[i] = child->keys[median + i];
  36.         }
  37.         newNode->next = child->next;
  38.         child->next = newNode;
  39.     }
  40.     else
  41.     {
  42.         newNode->numKeys = M - median - 1;
  43.         for (int i = 0; i < newNode->numKeys; i++)
  44.         {
  45.             newNode->keys[i] = child->keys[median + 1 + i];
  46.         }
  47.         for (int i = 0; i <= newNode->numKeys; i++)
  48.         {
  49.             newNode->children[i] = child->children[median + 1 + i];
  50.             child->children[median + 1 + i] = nullptr;
  51.         }
  52.     }
  53.  
  54.     child->numKeys = median;
  55.  
  56.     for (int i = parent->numKeys; i >= index + 1; i--)
  57.     {
  58.         parent->children[i + 1] = parent->children[i];
  59.     }
  60.     parent->children[index + 1] = newNode;
  61.  
  62.     for (int i = parent->numKeys - 1; i >= index; i--)
  63.     {
  64.         parent->keys[i + 1] = parent->keys[i];
  65.     }
  66.  
  67.     parent->keys[index] = child->keys[median];
  68.     parent->numKeys++;
  69. }
  70.  
  71. void insertNonFull(Node *node, int key)
  72. {
  73.     int i = node->numKeys - 1;
  74.  
  75.     if (node->isLeaf)
  76.     {
  77.         while (i >= 0 && node->keys[i] > key)
  78.         {
  79.             node->keys[i + 1] = node->keys[i];
  80.             i--;
  81.         }
  82.         node->keys[i + 1] = key;
  83.         node->numKeys++;
  84.     }
  85.     else
  86.     {
  87.         while (i >= 0 && node->keys[i] > key)
  88.         {
  89.             i--;
  90.         }
  91.         i++;
  92.  
  93.         if (node->children[i]->numKeys == M)
  94.         {
  95.             splitChild(node, i, node->children[i]);
  96.             if (node->keys[i] < key)
  97.             {
  98.                 i++;
  99.             }
  100.         }
  101.         insertNonFull(node->children[i], key);
  102.     }
  103. }
  104.  
  105. void insert(Node *&root, int key)
  106. {
  107.     if (root == nullptr)
  108.     {
  109.         root = new Node(true);
  110.         root->keys[0] = key;
  111.         root->numKeys = 1;
  112.         return;
  113.     }
  114.  
  115.     if (root->numKeys == M)
  116.     {
  117.         Node *newRoot = new Node(false);
  118.         newRoot->children[0] = root;
  119.         splitChild(newRoot, 0, root);
  120.  
  121.         int i = 0;
  122.         if (newRoot->keys[0] < key)
  123.         {
  124.             i++;
  125.         }
  126.         insertNonFull(newRoot->children[i], key);
  127.         root = newRoot;
  128.     }
  129.     else
  130.     {
  131.         insertNonFull(root, key);
  132.     }
  133. }
  134.  
  135. void removeFromLeaf(Node *node, int idx)
  136. {
  137.     for (int i = idx + 1; i < node->numKeys; ++i)
  138.     {
  139.         node->keys[i - 1] = node->keys[i];
  140.     }
  141.     node->numKeys--;
  142. }
  143.  
  144. void borrowFromPrev(Node *node, int idx)
  145. {
  146.     Node *child = node->children[idx];
  147.     Node *sibling = node->children[idx - 1];
  148.  
  149.     for (int i = child->numKeys - 1; i >= 0; --i)
  150.     {
  151.         child->keys[i + 1] = child->keys[i];
  152.     }
  153.  
  154.     if (!child->isLeaf)
  155.     {
  156.         for (int i = child->numKeys; i >= 0; --i)
  157.         {
  158.             child->children[i + 1] = child->children[i];
  159.         }
  160.     }
  161.  
  162.     if (child->isLeaf)
  163.     {
  164.         child->keys[0] = sibling->keys[sibling->numKeys - 1];
  165.         node->keys[idx - 1] = child->keys[0];
  166.     }
  167.     else
  168.     {
  169.         child->keys[0] = node->keys[idx - 1];
  170.         node->keys[idx - 1] = sibling->keys[sibling->numKeys - 1];
  171.         child->children[0] = sibling->children[sibling->numKeys];
  172.     }
  173.  
  174.     child->numKeys++;
  175.     sibling->numKeys--;
  176. }
  177.  
  178. int minKeysForNode()
  179. {
  180.     return (M + 1) / 2;
  181. }
  182.  
  183. void borrowFromNext(Node *node, int idx)
  184. {
  185.     Node *child = node->children[idx];
  186.     Node *sibling = node->children[idx + 1];
  187.  
  188.     if (child->isLeaf)
  189.     {
  190.         child->keys[child->numKeys] = sibling->keys[0];
  191.     }
  192.     else
  193.     {
  194.         child->keys[child->numKeys] = node->keys[idx];
  195.         node->keys[idx] = sibling->keys[0];
  196.         child->children[child->numKeys + 1] = sibling->children[0];
  197.     }
  198.  
  199.     for (int i = 1; i < sibling->numKeys; ++i)
  200.     {
  201.         sibling->keys[i - 1] = sibling->keys[i];
  202.     }
  203.     if (!sibling->isLeaf)
  204.     {
  205.         for (int i = 1; i <= sibling->numKeys; ++i)
  206.         {
  207.             sibling->children[i - 1] = sibling->children[i];
  208.         }
  209.     }
  210.  
  211.     child->numKeys++;
  212.     sibling->numKeys--;
  213.  
  214.     if (child->isLeaf)
  215.     {
  216.         node->keys[idx] = sibling->keys[0];
  217.     }
  218. }
  219.  
  220. void merge(Node *node, int idx)
  221. {
  222.     Node *child = node->children[idx];
  223.     Node *sibling = node->children[idx + 1];
  224.  
  225.     if (!child->isLeaf)
  226.     {
  227.         child->keys[child->numKeys] = node->keys[idx];
  228.         child->numKeys++;
  229.     }
  230.  
  231.     for (int i = 0; i < sibling->numKeys; ++i)
  232.     {
  233.         child->keys[child->numKeys + i] = sibling->keys[i];
  234.     }
  235.  
  236.     if (!child->isLeaf)
  237.     {
  238.         for (int i = 0; i <= sibling->numKeys; ++i)
  239.         {
  240.             child->children[child->numKeys + i] = sibling->children[i];
  241.         }
  242.     }
  243.  
  244.     child->numKeys += sibling->numKeys;
  245.  
  246.     if (child->isLeaf)
  247.     {
  248.         child->next = sibling->next;
  249.     }
  250.  
  251.     for (int i = idx + 1; i < node->numKeys; ++i)
  252.     {
  253.         node->keys[i - 1] = node->keys[i];
  254.     }
  255.     for (int i = idx + 2; i <= node->numKeys; ++i)
  256.     {
  257.         node->children[i - 1] = node->children[i];
  258.     }
  259.  
  260.     node->numKeys--;
  261.     delete sibling;
  262. }
  263.  
  264. void fill(Node *node, int idx)
  265. {
  266.     int minKeys = minKeysForNode();
  267.     if (idx != 0 && node->children[idx - 1]->numKeys > minKeys)
  268.     {
  269.         borrowFromPrev(node, idx);
  270.     }
  271.     else if (idx != node->numKeys && node->children[idx + 1]->numKeys > minKeys)
  272.     {
  273.         borrowFromNext(node, idx);
  274.     }
  275.     else
  276.     {
  277.         if (idx != node->numKeys)
  278.         {
  279.             merge(node, idx);
  280.         }
  281.         else
  282.         {
  283.             merge(node, idx - 1);
  284.         }
  285.     }
  286. }
  287.  
  288. void removeNode(Node *node, int key)
  289. {
  290.     int idx = 0;
  291.     while (idx < node->numKeys && node->keys[idx] < key)
  292.     {
  293.         idx++;
  294.     }
  295.  
  296.     if (node->isLeaf)
  297.     {
  298.         if (idx < node->numKeys && node->keys[idx] == key)
  299.         {
  300.             removeFromLeaf(node, idx);
  301.         }
  302.         return;
  303.     }
  304.  
  305.     if (idx < node->numKeys && node->keys[idx] == key)
  306.     {
  307.         idx++;
  308.     }
  309.  
  310.     int minKeys = minKeysForNode();
  311.  
  312.     bool flag = (idx == node->numKeys);
  313.  
  314.     if (node->children[idx]->numKeys == minKeys)
  315.     {
  316.         fill(node, idx);
  317.     }
  318.  
  319.     int childIndex = idx;
  320.     if (flag && idx > node->numKeys)
  321.     {
  322.         childIndex = idx - 1;
  323.     }
  324.  
  325.     removeNode(node->children[childIndex], key);
  326.  
  327.     if (node->children[childIndex] != nullptr && node->children[childIndex]->isLeaf && childIndex > 0)
  328.     {
  329.         node->keys[childIndex - 1] = node->children[childIndex]->keys[0];
  330.     }
  331. }
  332.  
  333. void deleteKey(Node *&root, int key)
  334. {
  335.     if (root == nullptr)
  336.         return;
  337.  
  338.     removeNode(root, key);
  339.  
  340.     if (root->numKeys == 0)
  341.     {
  342.         Node *tmp = root;
  343.         if (root->isLeaf)
  344.         {
  345.             root = nullptr;
  346.         }
  347.         else
  348.         {
  349.             root = root->children[0];
  350.         }
  351.         delete tmp;
  352.     }
  353. }
  354.  
  355. void printLeaves(Node *root)
  356. {
  357.     if (root == nullptr)
  358.         return;
  359.     Node *curr = root;
  360.     while (!curr->isLeaf)
  361.     {
  362.         curr = curr->children[0];
  363.     }
  364.     while (curr != nullptr)
  365.     {
  366.         for (int i = 0; i < curr->numKeys; i++)
  367.         {
  368.             std::cout << curr->keys[i] << " ";
  369.         }
  370.         curr = curr->next;
  371.     }
  372.     std::cout << std::endl;
  373. }
  374.  
  375. int main()
  376. {
  377.     Node *treeRoot = nullptr;
  378.  
  379.     insert(treeRoot, 10);
  380.     insert(treeRoot, 20);
  381.     insert(treeRoot, 5);
  382.     insert(treeRoot, 15);
  383.     insert(treeRoot, 30);
  384.  
  385.     printLeaves(treeRoot);
  386.  
  387.     deleteKey(treeRoot, 15);
  388.     printLeaves(treeRoot);
  389.  
  390.     deleteKey(treeRoot, 5);
  391.     printLeaves(treeRoot);
  392.  
  393.     return 0;
  394. }
Advertisement
Add Comment
Please, Sign In to add comment