Advertisement
nblknn

Текстовое дерево

Nov 15th, 2024
42
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 7.83 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdbool.h>
  3. #include <stdlib.h>
  4. #include <windows.h>
  5.  
  6. typedef struct Node {
  7.     int value;
  8.     struct Node *left;
  9.     struct Node *right;
  10.     struct Node *ware;
  11. } Node;
  12.  
  13. typedef struct ListNode {
  14.     Node *node;
  15.     struct ListNode *next;
  16. } ListNode;
  17.  
  18. Node *createTree(int rootValue) {
  19.     Node* root = malloc(sizeof(Node));
  20.     root->value = rootValue;
  21.     root->left = NULL;
  22.     root->right = NULL;
  23.     root->ware = NULL;
  24.     return root;
  25. }
  26.  
  27. void findPlace(Node** nodep, Node* newNode) {
  28.     Node *node = *nodep;
  29.     if (newNode->value > node->value)
  30.         if (node->right != NULL)
  31.             findPlace(&(node->right), newNode);
  32.         else
  33.             node->right = newNode;
  34.     else if (node->left != NULL)
  35.         findPlace(&(node->left), newNode);
  36.     else
  37.         node->left = newNode;
  38. }
  39.  
  40. bool isValueInTree(int value, Node *root) {
  41.     if (root != NULL) {
  42.         Node *temp;
  43.         temp = root;
  44.         while (temp != NULL) {
  45.             if (value == temp->value) {
  46.                 printf("Вершина уже есть в дереве!\n");
  47.                 return true;
  48.             }
  49.             else if (value > temp->value)
  50.                 temp = temp->right;
  51.             else
  52.                 temp = temp->left;
  53.         }
  54.     }
  55.     return false;
  56. }
  57.  
  58. void addNode(int value, Node** root) {
  59.     if (isValueInTree(value, *root)) return;
  60.     if (*root == NULL) {
  61.         *root = createTree(value);
  62.         return;
  63.     }
  64.     Node* newNode = malloc(sizeof(Node));
  65.     newNode->value = value;
  66.     newNode->left = NULL;
  67.     newNode->right = NULL;
  68.     newNode->ware = NULL;
  69.     findPlace(root, newNode);
  70. }
  71.  
  72. void destroyTree(Node **pnode) {
  73.     Node *node = *pnode;
  74.     if (node->right != NULL)
  75.         destroyTree(&(node->right));
  76.     if (node->right == NULL) {
  77.         if (node->left != NULL)
  78.             destroyTree(&(node->left));
  79.         if (node->left == NULL) {
  80.             free(node);
  81.             node = NULL;
  82.         }
  83.     }
  84. }
  85.  
  86. void addValuesToTree(Node **root) {
  87.     int value = 100;
  88.     printf("Введите значение (-99..99) для добавления в дерево, или введите 100 для прекращения ввода: ");
  89.     scanf("%d", &value);
  90.     while (value != 100) {
  91.         addNode(value, root);
  92.         printf("Введите значение (-99..99) для добавления в дерево, или введите 100 для прекращения ввода: ");
  93.         scanf("%d", &value);
  94.     }
  95. }
  96.  
  97. void outputTree(Node* node, int offset, char nodeType) {
  98.     for (int i = 0; i < offset; i++) {
  99.         printf(" ");
  100.     }
  101.     if (nodeType != 'W') {
  102.         printf("[%c] %d\n", nodeType, node->value);
  103.     }
  104.     else {
  105.         printf("[%c](%d)\n", 'R', node->value);
  106.         return;
  107.     }
  108.     if (node->left != NULL)
  109.         outputTree(node->left, offset + 2, 'L');
  110.     if (node->right != NULL)
  111.         outputTree(node->right, offset + 2, 'R');
  112.     if (node->ware != NULL)
  113.         outputTree(node->ware, offset + 2, 'W');
  114. }
  115.  
  116. void getRAB(Node *root) {
  117.     if (root == NULL) {
  118.         printf("%d ", 0);
  119.         return;
  120.     }
  121.     printf("(%d) ", root->value);
  122.     getRAB(root->left);
  123.     printf("%d ", root->value);
  124.     getRAB(root->right);
  125.     printf("%d ", root->value);
  126. }
  127.  
  128. void getARB(Node *root, ListNode **list) {
  129.     if (root == NULL) {
  130.         printf("%d ", 0);
  131.         return;
  132.     }
  133.     printf("%d ", root->value);
  134.     getARB(root->left, list);
  135.     printf("(%d) ", root->value);
  136.  
  137.     ListNode *listNode = malloc(sizeof(ListNode));
  138.     listNode->node = root;
  139.     listNode->next = NULL;
  140.     if (*list == NULL) {
  141.         *list = listNode;
  142.     }
  143.     else {
  144.         ListNode *temp = *list;
  145.         while (temp->next != NULL) {
  146.             temp = temp->next;
  147.         }
  148.         temp->next = listNode;
  149.     }
  150.  
  151.     getARB(root->right, list);
  152.     printf("%d ", root->value);
  153. }
  154.  
  155. void getARBNoPrint(Node *root, ListNode **list) {
  156.     if (root == NULL) {
  157.         return;
  158.     }
  159.     getARBNoPrint(root->left, list);
  160.  
  161.     ListNode *listNode = malloc(sizeof(ListNode));
  162.     listNode->node = root;
  163.     listNode->next = NULL;
  164.     if (*list == NULL) {
  165.         *list = listNode;
  166.     }
  167.     else {
  168.         ListNode *temp = *list;
  169.         while (temp->next != NULL) {
  170.             temp = temp->next;
  171.         }
  172.         temp->next = listNode;
  173.     }
  174.  
  175.     getARBNoPrint(root->right, list);
  176. }
  177.  
  178. void getABR(Node *root) {
  179.     if (root == NULL) {
  180.         printf("%d ", 0);
  181.         return;
  182.     }
  183.     printf("%d ", root->value);
  184.     getABR(root->left);
  185.     printf("%d ", root->value);
  186.     getABR(root->right);
  187.     printf("(%d) ", root->value);
  188. }
  189.  
  190. ListNode *getTraversals(Node *root) {
  191.     printf("-----------------------------------------\nОбходы:");
  192.     printf("\nRAB: ");
  193.     getRAB(root);
  194.     printf("\n\nARB: ");
  195.     ListNode *ARB = NULL;
  196.     getARB(root, &ARB);
  197.     printf("\n\nABR: ");
  198.     getABR(root);
  199.     return ARB;
  200. }
  201.  
  202. void getRightSymmWare(ListNode *ARB, Node *root) {
  203.     ListNode *temp = ARB;
  204.     while (ARB->next != NULL) {
  205.         if (ARB->node->right == NULL) {
  206.             ARB->node->ware = ARB->next->node;
  207.         }
  208.         ARB = ARB->next;
  209.     }
  210.     ARB->node->ware = root;
  211. }
  212.  
  213. Node *search(Node *root, int value) {
  214.     if ((root->left != NULL && root->left->value == value) || (root->right != NULL && root->right->value == value)) {
  215.         return root;
  216.     }
  217.     else if (root->value > value) {
  218.         return search(root->left, value);
  219.     }
  220.     else {
  221.         return search(root->right, value);
  222.     }
  223. }
  224.  
  225. Node *getLeftLeaf(Node *node) {
  226.     if (node->left == NULL) {
  227.         return node;
  228.     }
  229.     else {
  230.         return getLeftLeaf(node->left);
  231.     }
  232. }
  233.  
  234. Node *replace(Node *root) {
  235.     if (root->left == NULL) {
  236.         return root->right;
  237.     }
  238.     else if (root->right == NULL) {
  239.         return root->left;
  240.     }
  241.     else {
  242.         Node *node = getLeftLeaf(root->right);
  243.         node->left = root->left;
  244.         if (node->right == NULL) {
  245.             node->right = root->right;
  246.             Node *temp = search(root, node->value);
  247.             temp->left = NULL;
  248.         }
  249.         return node;
  250.     }
  251. }
  252.  
  253. Node *delete(Node *root, int value) {
  254.     if (root->value == value) {
  255.         root = replace(root);
  256.     }
  257.     else {
  258.         Node *node = search(root, value);
  259.         if (node->left != NULL && node->left->value == value) {
  260.             node->left = replace(node->left);
  261.         }
  262.         else {
  263.             node->right = replace(node->right);
  264.         }
  265.     }
  266.     return root;
  267. }
  268.  
  269. Node *deleteNode(Node *root) {
  270.     int value = 0;
  271.     printf("Введите значение вершины, которую нужно удалить:");
  272.     scanf("%d", &value);
  273.     return delete(root, value);
  274. }
  275.  
  276. void deleteWare(Node *root) {
  277.     if (root == NULL) return;
  278.     root->ware = NULL;
  279.     deleteWare(root->left);
  280.     deleteWare(root->right);
  281. }
  282.  
  283. int main(void) {
  284.     SetConsoleCP(1251);
  285.     SetConsoleOutputCP(1251);
  286.     Node* root = NULL;
  287.     addValuesToTree(&root);
  288.     printf("-----------------------------------------\nДерево:\n");
  289.     outputTree(root, 0, '-');
  290.     ListNode *ARB = getTraversals(root);
  291.     getRightSymmWare(ARB, root);
  292.     printf("\n-----------------------------------------\nДерево после правой симметричной прошивки:\n");
  293.     outputTree(root, 0, '-');
  294.     while (ARB != NULL) {
  295.         ListNode *temp = ARB;
  296.         ARB = ARB->next;
  297.         free(temp);
  298.     }
  299.     root = deleteNode(root);
  300.     getARBNoPrint(root, &ARB);
  301.     deleteWare(root);
  302.     getRightSymmWare(ARB, root);
  303.     printf("-----------------------------------------\nПерепрошитое дерево после удаления:\n");
  304.     outputTree(root, 0, '-');
  305.     while (ARB != NULL) {
  306.         ListNode *temp = ARB;
  307.         ARB = ARB->next;
  308.         free(temp);
  309.     }
  310.     destroyTree(&root);
  311.     int a;
  312.     scanf("%d", a);
  313.     return 0;
  314. }
  315.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement