Advertisement
Guest User

Untitled

a guest
Jan 27th, 2020
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.07 KB | None | 0 0
  1. #include <stdbool.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4.  
  5. struct ed
  6. {
  7.     int wartosc;
  8.     struct ed *prawy;
  9.     struct ed *lewy;
  10.     struct ed *rodzic;
  11. };
  12.  
  13. typedef struct ed ed;
  14.  
  15. ed *min(ed *korzen)
  16. {
  17.     if (korzen -> lewy == NULL)
  18.         return korzen;
  19.     else
  20.         korzen = min(korzen->lewy);
  21. }
  22.  
  23. ed *max(ed *korzen)
  24. {
  25.     if (korzen -> prawy == NULL)
  26.         return korzen;
  27.     else
  28.         korzen = max(korzen->prawy);
  29. }
  30.  
  31. ed *dodaj(ed *korzen, int x)
  32. {
  33.     /* If the tree is empty return an empty node */
  34.     if (korzen == NULL)
  35.     {
  36.         ed *q = (ed*)malloc(sizeof(ed));
  37.         q -> wartosc = x;
  38.         q -> lewy = NULL;
  39.         q -> prawy = NULL;
  40.         return q;
  41.     }
  42.  
  43.     /* Otherwise, recur down the tree */
  44.     if (x < korzen->wartosc)
  45.     {
  46.         korzen->lewy = dodaj(korzen->lewy, x);
  47.         korzen->lewy->rodzic = korzen;
  48.     }
  49.  
  50.     else if(x > korzen->wartosc)
  51.     {
  52.         korzen->prawy = dodaj(korzen->prawy, x);
  53.         korzen->prawy->rodzic = korzen;
  54.     }
  55.  
  56.     /* return the (unchanged) node pointer */
  57.     return korzen;
  58. }
  59.  
  60. ed *usun(ed* korzen, int x)
  61. {
  62.     if(korzen == NULL) return korzen;
  63.     if(x < korzen->wartosc)
  64.         korzen->lewy = usun(korzen->lewy, x);
  65.     else if(x > korzen->wartosc)
  66.         korzen->prawy = usun(korzen->prawy, x);
  67.     else
  68.     {
  69.         if(korzen->lewy == NULL)
  70.         {
  71.             ed *tymczasowy = korzen->prawy;
  72.             free(korzen);
  73.             return tymczasowy;
  74.         }
  75.         else if(korzen->prawy == NULL)
  76.         {
  77.             ed *tymczasowy = korzen->lewy;
  78.             free(korzen);
  79.             return tymczasowy;
  80.         }
  81.          ed *tymczasowy = min(korzen->prawy);
  82.          korzen->wartosc = tymczasowy->wartosc;
  83.          korzen->prawy = usun(korzen->prawy, tymczasowy->wartosc);
  84.     }
  85.     return korzen;
  86. }
  87.  
  88. ed *szukaj(ed *korzen, int x)
  89. {
  90.     if(korzen == NULL || korzen->wartosc == x)
  91.         return korzen;
  92.     if(korzen->wartosc < x)
  93.         return szukaj(korzen->prawy, x);
  94.     return szukaj(korzen->lewy, x);
  95. }
  96.  
  97. void drukuj(ed *korzen, int spacje)
  98. {
  99.     if(korzen == NULL)
  100.         return;
  101.     int i;
  102.     spacje += 10;
  103.     drukuj(korzen->prawy, spacje);
  104.     printf("\n");
  105.     for(i=10; i<spacje; i++)
  106.         printf(" ");
  107.     printf("%d\n", korzen->wartosc);
  108.     drukuj(korzen->lewy, spacje);
  109. }
  110.  
  111. ed *poprzednik(ed *korzen)
  112. {
  113.     if(korzen->lewy)
  114.         return max(korzen->lewy);
  115.     else
  116.     {
  117.         while(korzen->rodzic && (korzen->rodzic->lewy == korzen))
  118.             korzen = korzen->rodzic;
  119.     }
  120.     return korzen->rodzic;
  121. }
  122.  
  123. ed *nastepnik(ed *korzen)
  124. {
  125.     if(korzen->prawy)
  126.         return max(korzen->prawy);
  127.     else
  128.     {
  129.         while(korzen->rodzic && (korzen->rodzic->prawy == korzen))
  130.             korzen = korzen->rodzic;
  131.     }
  132.     return korzen->rodzic;
  133. }
  134.  
  135. int ile_x(ed *korzen, int x) // zlicza liczbe x-ów w drzewie
  136. {
  137.     if(korzen == 0)
  138.         return 0;
  139.     int pom = 0;
  140.     if(korzen->wartosc == x)
  141.         pom = 1;
  142.     return ile_x(korzen->lewy, x) + ile_x(korzen->prawy, x) + pom;
  143. }
  144.  
  145. bool czy_te_same(ed *korzen_1, ed *korzen_2)
  146. {
  147.     if(korzen_1 == 0) // a¿ skoñczymy sprawdzaæ wartoœci 1 drzewa w 2 drzewie
  148.         return true;
  149.     if(ile_x(korzen_2, korzen_1->wartosc) > 0) // przeszukuje w drzewie nr 2 wartosci z 1 drzewa
  150.         return czy_te_same(korzen_1->lewy, korzen_2) && czy_te_same(korzen_1->prawy, korzen_2);
  151.     else
  152.         return false;
  153. }
  154.  
  155. int liczba_lisci(ed *korzen)
  156. {
  157.     if(korzen == NULL)
  158.         return 0;
  159.     if(korzen->lewy == NULL && korzen->prawy == NULL)
  160.         return 1;
  161.     else
  162.         return liczba_lisci(korzen->lewy) + liczba_lisci(korzen->prawy);
  163. }
  164.  
  165. void sumaLisci(ed *korzen, int *suma)
  166. {
  167.     if(korzen != NULL)
  168.         return;
  169.     if(korzen->lewy != NULL && korzen->prawy != NULL)
  170.         *suma += korzen->wartosc;
  171.     sumaLisci(korzen->lewy, suma);
  172.     sumaLisci(korzen->prawy, suma);
  173. }
  174.  
  175. int liczebnosc(ed *korzen)
  176. {
  177.     if(korzen == NULL)
  178.         return 0;
  179.     else
  180.         return(liczebnosc(korzen->lewy) + liczebnosc(korzen->prawy) + 1);
  181. }
  182.  
  183. int liczebnosc(wsk T)
  184. {
  185.     if(T == NULL)
  186.         return 0;
  187.     else
  188.         return(liczebnosc(T->lewy) + liczebnosc(T->prawy) + 1);
  189. }
  190.  
  191. int wywazenie(wsk T)
  192. {
  193.     if(T == NULL)
  194.         return 0;
  195.     else
  196.         return max(abs(liczebnosc(korzen->lewy) - liczebnosc(korzen->prawy)), wywazenie(korzen->lewy), wywazenie(korzen->prawy));
  197. }
  198.  
  199. int glebokosc(ed *korzen)
  200. {
  201.     if(korzen == NULL)
  202.         return 0;
  203.     else
  204.     {
  205.         int glebokoscL = glebokosc(korzen->lewy);
  206.         int glebokoscR = glebokosc(korzen->prawy);
  207.         if(glebokoscL > glebokoscR)
  208.             return(glebokoscL + 1);
  209.         else return(glebokoscR + 1);
  210.     }
  211. }
  212.  
  213. void lustrzane_odbicie(ed *korzen)
  214. {
  215.     if(korzen == NULL)
  216.         return;
  217.     else
  218.     {
  219.         ed *tymczasowy;
  220.         lustrzane_odbicie(korzen->lewy);
  221.         lustrzane_odbicie(korzen->prawy);
  222.         tymczasowy = korzen->lewy;
  223.         korzen->lewy = korzen->prawy;
  224.         korzen->prawy = tymczasowy;
  225.     }
  226. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement