fork download
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. // ==================== Node ====================
  5.  
  6. template <typename Type, int Ord>
  7. struct Node
  8. {
  9. bool is_leaf;
  10. int num_keys;
  11. Type key[Ord];
  12.  
  13. Node(bool leaf)
  14. {
  15. is_leaf = leaf;
  16. num_keys = 0;
  17. }
  18.  
  19. virtual ~Node() = default;
  20. };
  21.  
  22. // ==================== Leaf Node ====================
  23.  
  24. template <typename Type, int Ord>
  25. struct LeafNode : public Node<Type, Ord>
  26. {
  27. LeafNode() : Node<Type, Ord>(true) {}
  28. };
  29.  
  30. // ==================== Internal Node ====================
  31.  
  32. template <typename Type, int Ord>
  33. struct InternalNode : public Node<Type, Ord>
  34. {
  35. Node<Type, Ord>* child[Ord + 1];
  36.  
  37. InternalNode() : Node<Type, Ord>(false)
  38. {
  39. for (int i = 0; i <= Ord; i++)
  40. child[i] = nullptr;
  41. }
  42. };
  43.  
  44. // ==================== B Tree ====================
  45.  
  46. template <typename Type, int Ord>
  47. struct BTree
  48. {
  49. private:
  50. static_assert(Ord >= 3, "Ord must be at least 3");
  51.  
  52. Node<Type, Ord>* root = nullptr;
  53.  
  54. static constexpr int MIN_KEYS = (Ord + 1) / 2 - 1;
  55.  
  56. // ==================== Search ====================
  57.  
  58. bool searchNode(Node<Type, Ord>* node, Type value) const
  59. {
  60. if (node == nullptr)
  61. return false;
  62.  
  63. int i;
  64.  
  65. for (i = 0; i < node->num_keys; i++)
  66. {
  67. if (value <= node->key[i]) break;
  68. }
  69.  
  70. if (i < node->num_keys && value == node->key[i])
  71. return true;
  72.  
  73. if (node->is_leaf)
  74. return false;
  75.  
  76. auto* p = static_cast<InternalNode<Type, Ord>*>(node);
  77.  
  78. return searchNode(p->child[i], value);
  79. }
  80.  
  81. // ==================== Split Leaf ====================
  82.  
  83. bool splitLeaf(Node<Type, Ord>* node, Type value,
  84. Type& promoted, Node<Type, Ord>*& right)
  85. {
  86. Type temp[Ord + 1];
  87.  
  88. int i;
  89.  
  90. for (i = node->num_keys - 1; i >= 0; i--)
  91. {
  92. if (value >= node->key[i]) break;
  93. temp[i + 1] = node->key[i];
  94. }
  95.  
  96. temp[i + 1] = value;
  97.  
  98. for (int j = 0; j <= i; j++)
  99. temp[j] = node->key[j];
  100.  
  101. int mid = (Ord + 1) / 2;
  102.  
  103. promoted = temp[mid];
  104.  
  105. right = new LeafNode<Type, Ord>();
  106.  
  107. node->num_keys = mid;
  108.  
  109. for (int j = 0; j < mid; j++)
  110. node->key[j] = temp[j];
  111.  
  112. right->num_keys = Ord - mid;
  113.  
  114. for (int j = 0; j < right->num_keys; j++)
  115. right->key[j] = temp[mid + 1 + j];
  116.  
  117. return true;
  118. }
  119.  
  120. // ==================== Split Internal ====================
  121.  
  122. bool splitInternal(Node<Type, Ord>* node, int pos,
  123. Type value, Node<Type, Ord>* newChild,
  124. Type& promoted, Node<Type, Ord>*& right)
  125. {
  126. auto* p = static_cast<InternalNode<Type, Ord>*>(node);
  127.  
  128. Type tempKeys[Ord + 1];
  129. Node<Type, Ord>* tempChildren[Ord + 2];
  130.  
  131. for (int i = 0; i < pos; i++)
  132. tempKeys[i] = node->key[i];
  133.  
  134. tempKeys[pos] = value;
  135.  
  136. for (int i = pos; i < node->num_keys; i++)
  137. tempKeys[i + 1] = node->key[i];
  138.  
  139. for (int i = 0; i <= pos; i++)
  140. tempChildren[i] = p->child[i];
  141.  
  142. tempChildren[pos + 1] = newChild;
  143.  
  144. for (int i = pos + 1; i <= node->num_keys; i++)
  145. tempChildren[i + 1] = p->child[i];
  146.  
  147. int mid = (Ord + 1) / 2;
  148.  
  149. promoted = tempKeys[mid];
  150.  
  151. right = new InternalNode<Type, Ord>();
  152.  
  153. auto* r = static_cast<InternalNode<Type, Ord>*>(right);
  154.  
  155. node->num_keys = mid;
  156.  
  157. for (int i = 0; i < mid; i++)
  158. node->key[i] = tempKeys[i];
  159.  
  160. for (int i = 0; i <= mid; i++)
  161. p->child[i] = tempChildren[i];
  162.  
  163. for (int i = mid + 1; i <= Ord; i++)
  164. p->child[i] = nullptr;
  165.  
  166. right->num_keys = Ord - mid;
  167.  
  168. for (int i = 0; i < right->num_keys; i++)
  169. right->key[i] = tempKeys[mid + 1 + i];
  170.  
  171. for (int i = 0; i <= right->num_keys; i++)
  172. r->child[i] = tempChildren[mid + 1 + i];
  173.  
  174. return true;
  175. }
  176.  
  177. // ==================== Insert ====================
  178.  
  179. bool insertRecursive(Node<Type, Ord>* node, Type value,
  180. Type& promoted, Node<Type, Ord>*& right)
  181. {
  182. if (node->is_leaf)
  183. {
  184. if (node->num_keys < Ord)
  185. {
  186. int i;
  187.  
  188. for (i = node->num_keys - 1; i >= 0; i--)
  189. {
  190. if (value >= node->key[i]) break;
  191. node->key[i + 1] = node->key[i];
  192. }
  193.  
  194. node->key[i + 1] = value;
  195. node->num_keys++;
  196.  
  197. return false;
  198. }
  199.  
  200. return splitLeaf(node, value, promoted, right);
  201. }
  202.  
  203. auto* p = static_cast<InternalNode<Type, Ord>*>(node);
  204.  
  205. int pos;
  206.  
  207. for (pos = 0; pos < node->num_keys; pos++)
  208. {
  209. if (value <= node->key[pos]) break;
  210. }
  211.  
  212. Type childPromoted{};
  213. Node<Type, Ord>* childRight = nullptr;
  214.  
  215. if (!insertRecursive(p->child[pos], value,
  216. childPromoted, childRight))
  217. return false;
  218.  
  219. if (node->num_keys < Ord)
  220. {
  221. for (int i = node->num_keys; i > pos; i--)
  222. node->key[i] = node->key[i - 1];
  223.  
  224. for (int i = node->num_keys + 1; i > pos + 1; i--)
  225. p->child[i] = p->child[i - 1];
  226.  
  227. node->key[pos] = childPromoted;
  228. p->child[pos + 1] = childRight;
  229. node->num_keys++;
  230.  
  231. return false;
  232. }
  233.  
  234. return splitInternal(node, pos, childPromoted, childRight,
  235. promoted, right);
  236. }
  237.  
  238. // ==================== Get Predecessor ====================
  239.  
  240. Type getPredecessor(Node<Type, Ord>* node) const
  241. {
  242. while (!node->is_leaf)
  243. {
  244. auto* p = static_cast<InternalNode<Type, Ord>*>(node);
  245. node = p->child[node->num_keys];
  246. }
  247.  
  248. return node->key[node->num_keys - 1];
  249. }
  250.  
  251. // ==================== Remove From Leaf ====================
  252.  
  253. void removeFromLeaf(Node<Type, Ord>* node, int idx)
  254. {
  255. for (int i = idx; i < node->num_keys - 1; i++)
  256. node->key[i] = node->key[i + 1];
  257.  
  258. node->num_keys--;
  259. }
  260.  
  261. // ==================== Borrow From Previous ====================
  262.  
  263. void borrowFromPrev(Node<Type, Ord>* parent, int idx)
  264. {
  265. auto* p = static_cast<InternalNode<Type, Ord>*>(parent);
  266.  
  267. Node<Type, Ord>* child = p->child[idx];
  268. Node<Type, Ord>* sibling = p->child[idx - 1];
  269.  
  270. for (int i = child->num_keys; i > 0; i--)
  271. child->key[i] = child->key[i - 1];
  272.  
  273. if (!child->is_leaf)
  274. {
  275. auto* c = static_cast<InternalNode<Type, Ord>*>(child);
  276. auto* s = static_cast<InternalNode<Type, Ord>*>(sibling);
  277.  
  278. for (int i = child->num_keys + 1; i > 0; i--)
  279. c->child[i] = c->child[i - 1];
  280.  
  281. c->child[0] = s->child[sibling->num_keys];
  282. s->child[sibling->num_keys] = nullptr;
  283. }
  284.  
  285. child->key[0] = parent->key[idx - 1];
  286.  
  287. parent->key[idx - 1] = sibling->key[sibling->num_keys - 1];
  288.  
  289. child->num_keys++;
  290. sibling->num_keys--;
  291. }
  292.  
  293. // ==================== Borrow From Next ====================
  294.  
  295. void borrowFromNext(Node<Type, Ord>* parent, int idx)
  296. {
  297. auto* p = static_cast<InternalNode<Type, Ord>*>(parent);
  298.  
  299. Node<Type, Ord>* child = p->child[idx];
  300. Node<Type, Ord>* sibling = p->child[idx + 1];
  301.  
  302. child->key[child->num_keys] = parent->key[idx];
  303.  
  304. if (!child->is_leaf)
  305. {
  306. auto* c = static_cast<InternalNode<Type, Ord>*>(child);
  307. auto* s = static_cast<InternalNode<Type, Ord>*>(sibling);
  308.  
  309. c->child[child->num_keys + 1] = s->child[0];
  310.  
  311. for (int i = 0; i < sibling->num_keys; i++)
  312. s->child[i] = s->child[i + 1];
  313.  
  314. s->child[sibling->num_keys] = nullptr;
  315. }
  316.  
  317. parent->key[idx] = sibling->key[0];
  318.  
  319. for (int i = 0; i < sibling->num_keys - 1; i++)
  320. sibling->key[i] = sibling->key[i + 1];
  321.  
  322. child->num_keys++;
  323. sibling->num_keys--;
  324. }
  325.  
  326. // ==================== Merge ====================
  327.  
  328. void merge(Node<Type, Ord>* parent, int idx)
  329. {
  330. auto* p = static_cast<InternalNode<Type, Ord>*>(parent);
  331.  
  332. Node<Type, Ord>* left = p->child[idx];
  333. Node<Type, Ord>* right = p->child[idx + 1];
  334.  
  335. int size = left->num_keys;
  336.  
  337. left->key[size] = parent->key[idx];
  338.  
  339. for (int i = 0; i < right->num_keys; i++)
  340. left->key[size + 1 + i] = right->key[i];
  341.  
  342. if (!left->is_leaf)
  343. {
  344. auto* l = static_cast<InternalNode<Type, Ord>*>(left);
  345. auto* r = static_cast<InternalNode<Type, Ord>*>(right);
  346.  
  347. for (int i = 0; i <= right->num_keys; i++)
  348. {
  349. l->child[size + 1 + i] = r->child[i];
  350. r->child[i] = nullptr;
  351. }
  352. }
  353.  
  354. left->num_keys += right->num_keys + 1;
  355.  
  356. for (int i = idx; i < parent->num_keys - 1; i++)
  357. parent->key[i] = parent->key[i + 1];
  358.  
  359. for (int i = idx + 1; i < parent->num_keys; i++)
  360. p->child[i] = p->child[i + 1];
  361.  
  362. p->child[parent->num_keys] = nullptr;
  363.  
  364. parent->num_keys--;
  365.  
  366. delete right;
  367. }
  368.  
  369. // ==================== Fix Underflow ====================
  370.  
  371. void fixChild(Node<Type, Ord>* parent, int idx)
  372. {
  373. auto* p = static_cast<InternalNode<Type, Ord>*>(parent);
  374.  
  375. Node<Type, Ord>* child = p->child[idx];
  376.  
  377. if (child->num_keys >= MIN_KEYS)
  378. return;
  379.  
  380. if (idx > 0 && p->child[idx - 1]->num_keys > MIN_KEYS)
  381. borrowFromPrev(parent, idx);
  382. else if (idx < parent->num_keys &&
  383. p->child[idx + 1]->num_keys > MIN_KEYS)
  384. borrowFromNext(parent, idx);
  385. else if (idx < parent->num_keys)
  386. merge(parent, idx);
  387. else if (idx > 0)
  388. merge(parent, idx - 1);
  389. }
  390.  
  391. // ==================== Remove ====================
  392.  
  393. bool removeRecursive(Node<Type, Ord>* node, Type value)
  394. {
  395. int idx;
  396.  
  397. for (idx = 0; idx < node->num_keys; idx++)
  398. {
  399. if (value <= node->key[idx]) break;
  400. }
  401.  
  402. if (idx < node->num_keys && value == node->key[idx])
  403. {
  404. if (node->is_leaf)
  405. {
  406. removeFromLeaf(node, idx);
  407. return true;
  408. }
  409.  
  410. auto* p = static_cast<InternalNode<Type, Ord>*>(node);
  411.  
  412. Type pred = getPredecessor(p->child[idx]);
  413.  
  414. node->key[idx] = pred;
  415.  
  416. bool removed = removeRecursive(p->child[idx], pred);
  417.  
  418. if (removed)
  419. fixChild(node, idx);
  420.  
  421. return removed;
  422. }
  423.  
  424. if (node->is_leaf)
  425. return false;
  426.  
  427. auto* p = static_cast<InternalNode<Type, Ord>*>(node);
  428.  
  429. bool removed = removeRecursive(p->child[idx], value);
  430.  
  431. if (removed)
  432. fixChild(node, idx);
  433.  
  434. return removed;
  435. }
  436.  
  437. // ==================== Display ====================
  438.  
  439. void displayNode(Node<Type, Ord>* node, int level) const
  440. {
  441. if (node == nullptr)
  442. return;
  443.  
  444. cout << string(level * 4, ' ') << "[ ";
  445.  
  446. for (int i = 0; i < node->num_keys; i++)
  447. cout << node->key[i] << " ";
  448.  
  449. cout << "]\n";
  450.  
  451. if (!node->is_leaf)
  452. {
  453. auto* p = static_cast<InternalNode<Type, Ord>*>(node);
  454.  
  455. for (int i = 0; i <= node->num_keys; i++)
  456. displayNode(p->child[i], level + 1);
  457. }
  458. }
  459.  
  460. // ==================== Destroy ====================
  461.  
  462. void destroy(Node<Type, Ord>* node)
  463. {
  464. if (node == nullptr)
  465. return;
  466.  
  467. if (!node->is_leaf)
  468. {
  469. auto* p = static_cast<InternalNode<Type, Ord>*>(node);
  470.  
  471. for (int i = 0; i <= node->num_keys; i++)
  472. destroy(p->child[i]);
  473. }
  474.  
  475. delete node;
  476. }
  477.  
  478. public:
  479.  
  480. BTree() = default;
  481.  
  482. ~BTree()
  483. {
  484. destroy(root);
  485. }
  486.  
  487. BTree(const BTree&) = delete;
  488. BTree& operator=(const BTree&) = delete;
  489.  
  490. // ==================== Search ====================
  491.  
  492. bool search(Type value) const
  493. {
  494. return searchNode(root, value);
  495. }
  496.  
  497. // ==================== Insert ====================
  498.  
  499. void insert(Type value)
  500. {
  501. if (search(value))
  502. {
  503. cout << "Value already exists!\n";
  504. return;
  505. }
  506.  
  507. if (root == nullptr)
  508. {
  509. root = new LeafNode<Type, Ord>();
  510. root->key[0] = value;
  511. root->num_keys = 1;
  512.  
  513. return;
  514. }
  515.  
  516. Type promoted{};
  517. Node<Type, Ord>* right = nullptr;
  518.  
  519. if (insertRecursive(root, value, promoted, right))
  520. {
  521. auto* newRoot = new InternalNode<Type, Ord>();
  522.  
  523. newRoot->key[0] = promoted;
  524. newRoot->num_keys = 1;
  525.  
  526. newRoot->child[0] = root;
  527. newRoot->child[1] = right;
  528.  
  529. root = newRoot;
  530. }
  531. }
  532.  
  533. // ==================== Remove ====================
  534.  
  535. void remove(Type value)
  536. {
  537. if (root == nullptr)
  538. {
  539. cout << "Tree is empty!\n";
  540. return;
  541. }
  542.  
  543. if (!search(value))
  544. {
  545. cout << "Value not found!\n";
  546. return;
  547. }
  548.  
  549. removeRecursive(root, value);
  550.  
  551. if (root->num_keys == 0)
  552. {
  553. Node<Type, Ord>* oldRoot = root;
  554.  
  555. if (root->is_leaf)
  556. {
  557. root = nullptr;
  558. }
  559. else
  560. {
  561. auto* p = static_cast<InternalNode<Type, Ord>*>(root);
  562.  
  563. root = p->child[0];
  564. p->child[0] = nullptr;
  565. }
  566.  
  567. delete oldRoot;
  568. }
  569. }
  570.  
  571. // ==================== Display ====================
  572.  
  573. void displayTree() const
  574. {
  575. if (root == nullptr)
  576. {
  577. cout << "Tree is empty!\n";
  578. return;
  579. }
  580.  
  581. displayNode(root, 0);
  582. }
  583. };
  584.  
  585. // ==================== Main ====================
  586.  
  587. int main()
  588. {
  589. BTree<int, 3> tree;
  590.  
  591. int choice;
  592. int value;
  593.  
  594. while (true)
  595. {
  596. cout << "\n========== B-Tree ==========\n";
  597. cout << "1. Insert\n";
  598. cout << "2. Delete\n";
  599. cout << "3. Search\n";
  600. cout << "4. Display\n";
  601. cout << "0. Exit\n";
  602.  
  603. cout << "Choice: ";
  604. cin >> choice;
  605.  
  606. switch (choice)
  607. {
  608. case 1:
  609. cout << "Enter value: ";
  610. cin >> value;
  611. tree.insert(value);
  612. break;
  613.  
  614. case 2:
  615. cout << "Enter value: ";
  616. cin >> value;
  617. tree.remove(value);
  618. break;
  619.  
  620. case 3:
  621. cout << "Enter value: ";
  622. cin >> value;
  623.  
  624. if (tree.search(value))
  625. cout << "Found!\n";
  626. else
  627. cout << "Not Found!\n";
  628.  
  629. break;
  630.  
  631. case 4:
  632. tree.displayTree();
  633. break;
  634.  
  635. case 0:
  636. cout << "Goodbye!\n";
  637. break;
  638.  
  639. default:
  640. cout << "Invalid choice!\n";
  641. }
  642.  
  643. if (choice == 0) break;
  644. }
  645.  
  646. return 0;
  647. }
Success #stdin #stdout 0.01s 5308KB
stdin
Standard input is empty
stdout
========== B-Tree ==========
1. Insert
2. Delete
3. Search
4. Display
0. Exit
Choice: Goodbye!