Advertisement
greannmhar

tree

Dec 2nd, 2024
35
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.60 KB | None | 0 0
  1. #include <iostream>
  2.  
  3. struct TreeNode {
  4.     int value;
  5.     TreeNode* left;
  6.     TreeNode* right;
  7.     TreeNode* next;
  8.  
  9.     TreeNode(int val) : value(val), left(nullptr), right(nullptr), next(nullptr) {}
  10. };
  11.  
  12. // Функция для связывания узлов одного уровня с помощью указателя next
  13. void ConnectNext(TreeNode* left, TreeNode* right) {
  14.     if (!left || !right) return;
  15.  
  16.     left->next = right;
  17.  
  18.     // Связываем узлы одного родителя
  19.     ConnectNext(left->left, left->right);
  20.     ConnectNext(right->left, right->right);
  21.  
  22.     // Связываем правого ребёнка одного узла с левым ребёнком следующего
  23.     ConnectNext(left->right, right->left);
  24. }
  25.  
  26. // Обёртка для обработки дерева
  27. TreeNode* Process(TreeNode* root) {
  28.     if (!root) return nullptr;
  29.     ConnectNext(root->left, root->right);
  30.     return root;
  31. }
  32.  
  33. // Построение дерева из ввода
  34. TreeNode* BuildTree() {
  35.     TreeNode* root = nullptr;
  36.  
  37.     std::cout << "Введите дерево в формате: Родитель Левый_Ребёнок Правый_Ребёнок.\n";
  38.     std::cout << "Для пропуска ребёнка введите -1. Завершите ввод пустой строкой.\n";
  39.  
  40.     TreeNode* nodes[100] = {nullptr}; // Максимум 100 узлов; индекс узла соответствует его значению
  41.  
  42.     while (true) {
  43.         int parent, left, right;
  44.         if (!(std::cin >> parent >> left >> right)) break;
  45.  
  46.         // Создаём узел-родитель, если он ещё не создан
  47.         if (!nodes[parent]) {
  48.             nodes[parent] = new TreeNode(parent);
  49.             if (!root) root = nodes[parent]; // Первый узел считается корнем
  50.         }
  51.  
  52.         // Создаём левого ребёнка, если он задан
  53.         if (left != -1) {
  54.             if (!nodes[left]) {
  55.                 nodes[left] = new TreeNode(left);
  56.             }
  57.             nodes[parent]->left = nodes[left];
  58.         }
  59.  
  60.         // Создаём правого ребёнка, если он задан
  61.         if (right != -1) {
  62.             if (!nodes[right]) {
  63.                 nodes[right] = new TreeNode(right);
  64.             }
  65.             nodes[parent]->right = nodes[right];
  66.         }
  67.     }
  68.  
  69.     return root;
  70. }
  71.  
  72. // Вспомогательная функция для вывода дерева с учётом указателей next
  73. void PrintTreeWithNext(TreeNode* root) {
  74.     if (!root) return;
  75.  
  76.     TreeNode* level = root;
  77.     while (level) {
  78.         TreeNode* current = level;
  79.         level = nullptr;
  80.  
  81.         while (current) {
  82.             std::cout << current->value << " -> ";
  83.             if (!level && (current->left || current->right)) {
  84.                 level = current->left ? current->left : current->right;
  85.             }
  86.             current = current->next;
  87.         }
  88.         std::cout << "NULL\n";
  89.     }
  90. }
  91.  
  92. int main() {
  93.     // Построение дерева
  94.     TreeNode* root = BuildTree();
  95.  
  96.     // Обработка дерева
  97.     Process(root);
  98.  
  99.     // Вывод результата
  100.     std::cout << "Результат (уровни дерева с указателями next):\n";
  101.     PrintTreeWithNext(root);
  102.  
  103.     // Освобождение памяти (опционально)
  104.     // Здесь можно добавить функцию для рекурсивного удаления узлов.
  105.  
  106.     return 0;
  107. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement