Advertisement
Gistrec

BinaryTree v1

Mar 5th, 2018
198
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.73 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.             std::cout << node->average_mark << " ";
  61.             suffix_traverse(node->left);
  62.         }
  63.     }
  64.     void suffix_traverse() {
  65.         suffix_traverse(root);
  66.     }
  67.  
  68.     ~BinaryTree() {
  69.         // TODO: delete tree
  70.     }
  71. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement