Advertisement
Gistrec

BinaryTree v2

Mar 5th, 2018
224
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.39 KB | None | 0 0
  1. #include <string>
  2. #include <vector>
  3. #include <iostream>
  4.  
  5. // Двоичное дерево поиска
  6. // Ключ левого поддерева меньше, чем ключ узла
  7. // Ключ правого поддерева больше или равен ключу узла
  8. class BinaryTree {
  9. private:
  10.     struct Node {
  11.         std::string name; // Имя студента
  12.         std::vector<int> mark; // Три оценки
  13.         float average_mark; // Средняя оценка
  14.         Node* left; // Указатель на левое поддерево
  15.         Node* right; // Указатель на левое поддерево
  16.  
  17.         Node(std::string &name, std::vector<int> &mark)
  18.                 : left(nullptr), right(nullptr) {
  19.             this->name = name;
  20.             this->mark = mark;
  21.             average_mark = (float)(mark[0] + mark[1] + mark[2]) / 3;
  22.         }
  23.     };
  24.  
  25.     Node* root = nullptr; // Корень дерева
  26. public:
  27.     // Функция нужна для получения вершины, в которую будем вставлять
  28.     inline Node* getParentNode(Node* &insertNode) {
  29.         auto parentNode = root;
  30.         while (true) {
  31.             if (parentNode->average_mark > insertNode->average_mark) {
  32.                 if (parentNode->left == nullptr) return parentNode;
  33.                 else parentNode = parentNode->left;
  34.             } else {
  35.                 if (parentNode->right == nullptr) return parentNode;
  36.                 else parentNode = parentNode->right;
  37.             }
  38.         }
  39.     }
  40.  
  41.     // Функция для добавления новой записи в дерево
  42.     void addToTree(std::string &name, std::vector<int> &mark) {
  43.         auto newNode = new Node(name, mark);
  44.  
  45.         // Ищем вершину, в которую будем вставлять узел
  46.         if (root == nullptr) {
  47.             root = newNode;
  48.         }else {
  49.             Node* parentNode = getParentNode(newNode);
  50.             if (parentNode->average_mark > newNode->average_mark) parentNode->left = newNode;
  51.             else parentNode->right = newNode;
  52.         }
  53.     }
  54.  
  55.     // Позволяет обойти все узлы дерева в порядке убывания ключей
  56.     // следуя порядку (правое поддерево, вершина, левое поддерево)
  57.     void suffix_traverse(Node* node) {
  58.         if (node != nullptr) {
  59.             suffix_traverse(node->right);
  60.             // TODO: За такое обычно руки отрывают, но, ладно
  61.             std::cout << "Имя: " << node->name << "   Средняя оценка: "
  62.                       << node->average_mark << "   Оценки: " << node->mark[0]
  63.                       << " " << node->mark[1] << " " << node->mark[1] << std::endl;
  64.             suffix_traverse(node->left);
  65.         }
  66.     }
  67.     void suffix_traverse() {
  68.         suffix_traverse(root);
  69.     }
  70.  
  71.     ~BinaryTree() {
  72.         postfix_delete(root);
  73.     }
  74.     void postfix_delete(Node* node) {
  75.         // Сначала удаляем левое поддерево
  76.         if (node->left != nullptr) postfix_delete(node->left);
  77.         // Потом удаляем правое поддерево
  78.         if (node->right != nullptr) postfix_delete(node->right);
  79.         // Удаляем узел
  80.         delete node;
  81.     }
  82. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement