Advertisement
Vladislav8653

деревья аисд

Dec 12th, 2023 (edited)
859
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.79 KB | None | 0 0
  1. //это код как бы для c++, но он использует синтаксис си, поэтому тут есть этот дурацкий define nullptr null
  2. //короче это просто сишный кодик
  3. #include "stdio.h"
  4. #include <stdlib.h>
  5. #define nullptr NULL
  6.  
  7. struct tree {
  8.     int data;
  9.     struct tree *left;
  10.     struct tree *right;
  11. };
  12.  
  13. struct tree *createNode(int rootNode)
  14. {
  15.     struct tree *head = malloc(sizeof (struct tree));
  16.     head->left = nullptr; // = null, но это эволюция
  17.     head->right = nullptr;
  18.     head->data = rootNode;
  19.     return head;
  20. }
  21.  
  22. void addNode (struct tree *head, int data)
  23. {
  24.     if (data < head->data){
  25.         if (head->left != nullptr){
  26.             addNode(head->left, data);
  27.         } else {
  28.             struct tree *node = createNode(data);
  29.             head->left = node;
  30.             // node->data = data;
  31.         }
  32.     } else if (data >= head->data) {
  33.         if (head->right != nullptr){
  34.             addNode(head->right, data);
  35.         } else {
  36.             struct tree *node = createNode(data);
  37.             head->right = node;
  38.             //node->data = data;
  39.         }
  40.     }
  41. }
  42.  
  43. void freeTree (struct tree *head){
  44.     if (head != nullptr){
  45.         freeTree(head->right);
  46.         freeTree(head->left);
  47.         free(head);
  48.     }
  49. }
  50.  
  51. void print(struct tree *head, long n)
  52. {
  53.     long i;
  54.     if (head)
  55.     {
  56.         print(head->right, n+5);
  57.         for (i = 0; i < n; i++)
  58.             printf(" ");
  59.         printf("%d\n", head->data);
  60.         print(head->left, n+5);
  61.     }
  62. }
  63.  
  64. void fromUptoDown (struct tree *head){
  65.     if (head != nullptr){
  66.         printf("%d ", head->data);
  67.         fromUptoDown(head->left);
  68.         fromUptoDown(head->right);
  69.     }
  70. }
  71.  
  72. void fromDowntoUp (struct tree *head){
  73.     if (head != nullptr){
  74.         fromDowntoUp(head->left);
  75.         fromDowntoUp(head->right);
  76.         printf("%d ", head->data);
  77.     }
  78. }
  79.  
  80. void fromLeftToRight (struct tree *head){
  81.     if (head != nullptr){
  82.         fromLeftToRight(head->left);
  83.         printf("%d ", head->data);
  84.         fromLeftToRight(head->right);
  85.     }
  86. }
  87.  
  88. void rightThreadedInorder(struct tree *head) {
  89.     struct tree *current = head;
  90.     struct tree *prev = nullptr;
  91.     while (current != nullptr) {
  92.         if (current->left == nullptr) {
  93.             printf("%d -> ", current->data);
  94.             current = current->right;
  95.         } else {
  96.             prev = current->left;
  97.             while (prev->right != nullptr && prev->right != current) {
  98.                 prev = prev->right;
  99.             }
  100.             if (prev->right == nullptr) {
  101.                 prev->right = current;
  102.                 current = current->left;
  103.             } else {
  104.                 prev->right = nullptr;
  105.                 printf("%d -> ", current->data);
  106.                 current = current->right;
  107.             }
  108.         }
  109.     }
  110.     printf("%d", 50);
  111. }
  112.  
  113. int main() {
  114.     struct tree *head = createNode(50);
  115.     addNode(head, 40);
  116.     addNode(head, 30);
  117.     addNode(head, 45);
  118.     addNode(head, 60);
  119.     addNode(head, 55);
  120.     addNode(head, 70);
  121.     print(head, 0);
  122.     printf("%s", "Top-to-bottom bypass: ");
  123.     fromUptoDown(head); // сверху вниз
  124.     printf("%s", "\nBottom-to-top bypass: ");
  125.     fromDowntoUp(head); // снизу вверх
  126.     printf("%s", "\nLeft-to-right bypass: ");
  127.     fromLeftToRight(head); // слева направо
  128.     printf("%s", "\nFlashing: ");
  129.     rightThreadedInorder(head);
  130.     freeTree(head);
  131.     return 0;
  132. }
  133.  
  134. /*
  135. построить дерево двоичного поиска, вывести его на экран
  136. выполнить 3 полных обхода (вывести на экран), симметричную правую прошивку (вывести ее на экран)
  137. */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement