iawitm

Untitled

Apr 17th, 2019
131
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.78 KB | None | 0 0
  1. #include "stdafx.h"
  2. #include <iostream>
  3.  
  4.  
  5. using namespace std;
  6.  
  7. struct Tree {
  8.     int field;           // поле данных
  9.     struct Tree *left;  // левый потомок
  10.     struct Tree *right; // правый потомок
  11. };
  12.  
  13.  
  14. // Префиксный обход
  15. void traversalPrefix(Tree *tree) {
  16.     if (tree != NULL) { //Пока не встретится пустой узел
  17.         cout << tree->field << ' '; //Отображаем корень дерева
  18.         traversalPrefix(tree->left); //Рекурсивная функция для левого поддерева
  19.         traversalPrefix(tree->right); //Рекурсивная функция для правого поддерева
  20.     }
  21. }
  22. // Инфиксный обход
  23. void traversalInfix(Tree *tree) {
  24.     if (tree != NULL) { //Пока не встретится пустой узел
  25.         traversalInfix(tree->left); //Рекурсивная функция для левого поддерева
  26.         cout << tree->field << ' '; //Отображаем корень дерева
  27.         traversalInfix(tree->right); //Рекурсивная функция для правого поддерева
  28.     }
  29. }
  30.  
  31. // Постфиксный обход
  32. void traversalPostfix(Tree *tree) {
  33.     if (tree != NULL) { //Пока не встретится пустой узел
  34.         traversalPostfix(tree->left); //Рекурсивная функция для левого поддерева
  35.         traversalPostfix(tree->right); //Рекурсивная функция для правого поддерева
  36.         cout << tree->field<<' '; //Отображаем корень дерева
  37.     }
  38. }
  39.  
  40. struct Tree* addValue(int x, Tree *tree) {
  41.     if (tree == NULL) { // Если дерева нет, то формируем корень
  42.         tree = new Tree; // память под узел
  43.         tree->field = x;   // поле данных
  44.         tree->left = NULL;
  45.         tree->right = NULL; // ветви инициализируем пустотой
  46.     }
  47.     else  if (x < tree->field)   // условие добавление левого потомка
  48.         tree->left = addValue(x, tree->left);
  49.     else    // условие добавление правого потомка
  50.         tree->right = addValue(x, tree->right);
  51.     return(tree);
  52. }
  53.  
  54.  
  55. Tree* deleteNode(Tree* node, int val) {
  56.     if (node == NULL)
  57.         return node;
  58.  
  59.     if (val == node->field) {
  60.  
  61.         Tree* tmp;
  62.         if (node->right == NULL)
  63.             tmp = node->left;
  64.         else {
  65.  
  66.             Tree* ptr = node->right;
  67.             if (ptr->left == NULL) {
  68.                 ptr->left = node->left;
  69.                 tmp = ptr;
  70.             }
  71.             else {
  72.                 Tree* pmin = ptr->left;
  73.                 while (pmin->left != NULL) {
  74.                     ptr = pmin;
  75.                     pmin = ptr->left;
  76.                 }
  77.                 ptr->left = pmin->right;
  78.                 pmin->left = node->left;
  79.                 pmin->right = node->right;
  80.                 tmp = pmin;
  81.             }
  82.         }
  83.  
  84.         delete node;
  85.         return tmp;
  86.     }
  87.     else if (val < node->field)
  88.         node->left = deleteNode(node->left, val);
  89.     else
  90.         node->right = deleteNode(node->right, val);
  91.     return node;
  92. }
  93.  
  94. int main()
  95. {
  96.     setlocale(LC_ALL, "ru");
  97.     Tree *tree = NULL;
  98.     int n;
  99.     int value;
  100.     cout << "Как много элементов вы хотите добавить?" << endl;
  101.     cin >> n;
  102.     for (int i = 0; i < n; i++) {
  103.         cout << "Введите значения узла" << endl;
  104.         cin >> value;
  105.         tree = addValue(value, tree);
  106.     }
  107.     cout << "Префиксный обход дерева:" << endl;
  108.     traversalPrefix(tree);
  109.     cout << endl;
  110.     cout << "Инфиксный обход дерева:" << endl;
  111.     traversalInfix(tree);
  112.     cout << endl;
  113.     cout << "Постфиксный обход дерева:" << endl;
  114.     traversalPostfix(tree);
  115.     cout << endl;
  116.     cout << "Введите значение узла, которое необходимо удалить" << endl;
  117.     cin >> value;
  118.     deleteNode(tree, value);
  119.     traversalPrefix(tree); 
  120.     system("pause");
  121.     return 0;
  122. }
Advertisement
Add Comment
Please, Sign In to add comment