Advertisement
DaniDori

BTree.h

Nov 2nd, 2023
532
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.00 KB | None | 0 0
  1. #pragma once
  2. #define _CRT_SECURE_NO_WARNINGS
  3. #include <vector>
  4. #include <string>
  5.  
  6. class BTree;  // Предварительное объявление класса BTree
  7.  
  8. // Узел В-дерева
  9. struct BTreeNode {
  10.     string* keys;             // Ключи узла
  11.     long* positions;               // Позиции записей в файле
  12.     BTreeNode** C;                 // Дочерние узлы
  13.     int n;                         // Текущее количество ключей
  14.     bool leaf;                     // Является ли узел листом
  15.     int t;                         // Минимальная степень (t >= 2)
  16.     BTree* parentTree; // Ссылка на родительское дерево
  17.  
  18.     BTreeNode(int _t, bool _leaf, BTree* parent);
  19.  
  20.     // Основные функции
  21.     void traverse();
  22.     BTreeNode* search(const string& k);
  23.     int findKey(const string& k);
  24.  
  25.     // Функции для вставки ключа
  26.     void insertNonFull(const string& k, long position);
  27.     void splitChild(int i, BTreeNode* y);
  28.  
  29.     // Функции для удаления ключа
  30.     void remove(const string& k);
  31.     void removeFromLeaf(int idx);
  32.     void removeFromNonLeaf(int idx);
  33.     string getPred(int idx);
  34.     string getSucc(int idx);
  35.     void fill(int idx);
  36.     void borrowFromPrev(int idx);
  37.     void borrowFromNext(int idx);
  38.     void merge(int idx);
  39.  
  40.     // Утилиты
  41.     void printTree(int depth = 0);
  42. };
  43.  
  44. // Класс В-дерева
  45. class BTree {
  46.     BTreeNode* root;
  47.     int t;  // Минимальная степень
  48.     int splitCount;  // Счётчик разделений узлов (поворотов)
  49. public:
  50.     BTree(int _t) : root(nullptr), t(_t), splitCount(0) {}
  51.  
  52.     ~BTree();
  53.  
  54.     void clear(BTreeNode* node);
  55.  
  56.     // Функции управления деревом
  57.     void traverse() {
  58.         if (root != nullptr) root->traverse();
  59.     }
  60.  
  61.     BTreeNode* search(const string& k) {
  62.         return (root == nullptr) ? nullptr : root->search(k);
  63.     }
  64.  
  65.     void insert(const string& k, long position);
  66.     void remove(const string& k);
  67.     void printTree() {
  68.         if (root != nullptr) root->printTree();
  69.     }
  70.  
  71.     void buildTreeFromFile(const string& binaryFileName);
  72.  
  73.     void increaseSplitCount() { splitCount++; }
  74.     int getSplitCount() const { return splitCount; }
  75.  
  76.     int getTotalKeyCount() const {
  77.         return getTotalKeyCount(root);
  78.     }
  79.  
  80. private:
  81.     int getTotalKeyCount(BTreeNode* node) const {
  82.         if (node == nullptr) return 0;
  83.  
  84.         int count = node->n;  // количество ключей в текущем узле
  85.         if (!node->leaf) {
  86.             // Если узел не лист, считаем количество ключей в дочерних узлах
  87.             for (int i = 0; i <= node->n; i++) {
  88.                 count += getTotalKeyCount(node->C[i]);
  89.             }
  90.         }
  91.         return count;
  92.     }
  93. };
  94.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement