Advertisement
ElfikCo

AISD BST

May 16th, 2019
334
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 7.86 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. struct bst{
  5.     struct bst *left;
  6.     struct bst *right;
  7.     struct bst *p;
  8.     int k;
  9. };
  10.  
  11. void bst_inorder(struct bst*);
  12. void bst_postorder(struct bst*);
  13. void bst_preorder(struct bst*);
  14. struct bst * bst_wstaw(struct bst*, struct bst*);
  15. struct bst * bst_szukaj(struct bst*, int);
  16. struct bst * bst_szukaj_r(struct bst*, int);
  17. struct bst * bst_min(struct bst*);
  18. struct bst * bst_max(struct bst*);
  19. struct bst * bst_usun(struct bst*, struct bst*);
  20. struct bst * bst_nastepnik(struct bst*);
  21. struct bst * bst_poprzednik(struct bst*);
  22.  
  23. int main(){
  24.     int i, quit = 1;
  25.     char znak;
  26.     struct bst *root = NULL, *nowy = NULL;
  27.    
  28.     while(quit){
  29.         printf("\nWybierz akcje:");
  30.         printf("\n[D] - Dodaj nowy element");
  31.         printf("\n[W] - Wyswietl elementy");
  32.         printf("\n[S] - Znajdz element");
  33.         printf("\n[M] - Znajdz minimalny element");
  34.         printf("\n[X] - Znajdz maksymalny element");
  35.         printf("\n[N] - Znajdz nastÄ™pnik elementu");
  36.         printf("\n[P] - Znajdz poprzednik elementu");
  37.         printf("\n[U] - Usun element");
  38.         printf("\n[Q] - Wyjdz z programu\n");
  39.         fflush(stdin);
  40.         scanf("%c", &znak);
  41.  
  42.         system("cls");
  43.        
  44.         switch(znak){
  45.             case 'd':
  46.                 printf("Podaj klucz elementu do wstawienia: ");
  47.                 scanf("%d", &i);
  48.                 nowy = calloc(1, sizeof(struct bst));
  49.                 nowy -> k = i;
  50.                 root = bst_wstaw(root, nowy);
  51.                 break;
  52.             case 'w':
  53.                 if (root == NULL) {
  54.                     printf("Drzewo jest puste");
  55.                     break;
  56.                 }
  57.                 printf("Inorder: ");
  58.                 bst_inorder(root);
  59.                 printf("Preorder: ");
  60.                 bst_preorder(root);
  61.                 printf("Postorder: ");
  62.                 bst_postorder(root);
  63.                 break;
  64.             case 's':
  65.                 printf("Podaj klucz szukanego elementu: ");
  66.                 scanf("%d", &i);
  67.                 nowy = calloc(1, sizeof(struct bst));
  68.                 nowy = bst_szukaj(root, i);
  69.                 if (nowy == NULL)
  70.                     printf("Elementu o kluczu %d nieznaleziono", i);
  71.                 else
  72.                     printf("Znaleziono element o kluczu %d", i);
  73.                 break;
  74.             case 'm':
  75.                 nowy = calloc(1, sizeof(struct bst));
  76.                 nowy = bst_min(root);
  77.                 if (nowy == NULL)
  78.                     printf("W drzewie nie ma elementow");
  79.                 else
  80.                     printf("Najmniejszy klucz w drzewie wynosi %d", nowy -> k);
  81.                 break;
  82.             case 'x':
  83.                 nowy = calloc(1, sizeof(struct bst));
  84.                 nowy = bst_max(root);
  85.                 if (nowy == NULL)
  86.                     printf("W drzewie nie ma elementow");
  87.                 else
  88.                     printf("Najwiekszy klucz w drzewie wynosi %d", nowy -> k);
  89.                 break;
  90.             case 'n':
  91.                 printf("Podaj klucz elementu dla ktorego znalezc nastepnik: ");
  92.                 scanf("%d", &i);
  93.                 nowy = calloc(1, sizeof(struct bst));
  94.                 nowy = bst_szukaj(root, i);
  95.                 if (nowy == NULL)
  96.                     printf("Nie znaleziono elementu o kluczu %d", i);
  97.                 else {
  98.                     nowy = bst_nastepnik(nowy);
  99.                     if (nowy == NULL)
  100.                         printf("Element o kluczu %d nie ma nastepnika", i);
  101.                     else
  102.                         printf("Nastepnik elementu o kluczu %d ma klucz wynoszacy %d", i, nowy -> k);
  103.                 }
  104.                 break;
  105.             case 'p':
  106.                 printf("Podaj klucz elementu dla ktorego znalezc poprzednik: ");
  107.                 scanf("%d", &i);
  108.                 nowy = calloc(1, sizeof(struct bst));
  109.                 nowy = bst_szukaj(root, i);
  110.                 if (nowy == NULL)
  111.                     printf("Nie znaleziono elementu o kluczu %d", i);
  112.                 else {
  113.                     nowy = bst_poprzednik(nowy);
  114.                     if (nowy == NULL)
  115.                         printf("Element o kluczu %d nie ma poprzednika", i);
  116.                     else
  117.                         printf("Poprzednik elementu o kluczu %d ma klucz wynoszacy %d", i, nowy -> k);
  118.                 }
  119.                 break;
  120.             case 'u':
  121.                 printf("Podaj klucz elementu do usuniecia: ");
  122.                 scanf("%d", &i);
  123.                 nowy = calloc(1, sizeof(struct bst));
  124.                 nowy = bst_szukaj(root, i);
  125.                 if (nowy == NULL){
  126.                     printf("Nie znaleziono elementu o kluczu %d", i);
  127.                     break;
  128.                 }
  129.                 else{
  130.                     root = bst_usun(root, nowy);
  131.                 }
  132.                 break;
  133.             case 'q':
  134.                 quit = 0;
  135.                 break;
  136.         }
  137.  
  138.     }
  139.  
  140.     system("pause");
  141.     return 1;
  142. }
  143.  
  144. void bst_inorder(struct bst *root){
  145.     struct bst *x = root;
  146.     if (x != NULL && x -> left != NULL)
  147.         bst_inorder(x->left);
  148.     printf("%d ", x -> k);
  149.     if (x -> right != NULL)
  150.         bst_inorder(x -> right);
  151. }
  152.  
  153. void bst_preorder(struct bst *root){
  154.     struct bst *x = root;
  155.     printf("%d ", x -> k);
  156.     if (x != NULL && x -> left != NULL)
  157.         bst_inorder(x->left);
  158.     if (x -> right != NULL)
  159.         bst_inorder(x -> right);
  160. }
  161.  
  162. void bst_postorder(struct bst *root){
  163.     struct bst *x = root;
  164.     if (x != NULL && x -> left != NULL)
  165.         bst_inorder(x->left);
  166.     if (x -> right != NULL)
  167.         bst_inorder(x -> right);
  168.     printf("%d ", x -> k);
  169. }
  170.  
  171. struct bst * bst_wstaw(struct bst* root, struct bst* nowy){
  172.     struct bst *x = root, *y = NULL;
  173.     while (x != NULL){
  174.         y = x;
  175.         if (nowy -> k < x -> k)
  176.             x = x -> left;
  177.         else
  178.             x = x -> right;
  179.     }
  180.     nowy -> p = y;
  181.     if (y == NULL)
  182.         root = nowy;
  183.     else
  184.         if (nowy -> k < y -> k)
  185.             y -> left = nowy;
  186.         else
  187.             y -> right = nowy;
  188.     return root;
  189. }
  190.  
  191. struct bst * bst_szukaj(struct bst* root, int key){
  192.     struct bst *x = root;
  193.     while (x != NULL && key != x -> k){
  194.         if (key < x -> k)
  195.             x = x -> left;
  196.         else
  197.             x = x -> right;
  198.     }
  199.     return x;
  200. }
  201.  
  202. struct bst * bst_szukaj_r(struct bst* root, int key){
  203.     struct bst *x = root;
  204.     if (x == NULL) return NULL;
  205.     else if (x -> k == key) return x;
  206.     else if (key < x -> k) return bst_szukaj(x -> left, key);
  207.     else return bst_szukaj(x -> right, key);
  208. }
  209.  
  210. struct bst * bst_min(struct bst *root){
  211.     struct bst *x = root;
  212.     while (x -> left != NULL)
  213.         x = x -> left;
  214.     return x;
  215. }
  216.  
  217. struct bst * bst_max(struct bst *root){
  218.     struct bst *x = root;
  219.     while (x -> right != NULL)
  220.         x = x -> right;
  221.     return x;
  222. }
  223.  
  224. struct bst * bst_nastepnik(struct bst *look){
  225.     struct bst *x = look, *y = NULL;
  226.     if (x -> right != NULL)
  227.         return bst_min(x -> right);
  228.     y = x -> p;
  229.     while (y != NULL && x == y -> right){
  230.         x = y;
  231.         y = y -> p;
  232.     }
  233.     return y;
  234. }
  235.  
  236. struct bst * bst_poprzednik(struct bst *look){
  237.     struct bst *x = look, *y = NULL;
  238.     if (x -> left != NULL)
  239.         return bst_max(x -> left);
  240.     y = x -> p;
  241.     while (y != NULL && x == y -> left){
  242.         x = y;
  243.         y = y -> p;
  244.     }
  245.     return y;
  246. }
  247.  
  248. struct bst * bst_usun(struct bst *root, struct bst *waste){
  249.     struct bst *y = NULL, *x = NULL, *T = root;
  250.     int temp;
  251.     if (root -> left == NULL && root -> right == NULL) return NULL;
  252.     if (waste -> left == NULL || waste -> right == NULL)
  253.         y = waste;
  254.     else
  255.         y = bst_nastepnik(waste);
  256.     if (y -> left != NULL)
  257.         x = y -> left;
  258.     else
  259.         x = y -> right;
  260.     if (y != NULL)
  261.         x -> p = y -> p;
  262.     if (y -> p == NULL)
  263.         T = x;
  264.     else if (y == y -> p -> left)
  265.        y -> p -> left = x;
  266.     else
  267.         y -> p -> right = x;
  268.     if (y != waste){
  269.         temp = y -> k;
  270.         y -> k = waste -> k;
  271.         waste -> k = temp;
  272.     }
  273.     free(y);
  274.     free(x);
  275.     return T;
  276. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement