Advertisement
Guest User

Untitled

a guest
Jan 27th, 2020
91
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.21 KB | None | 0 0
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. //I
  5. // (a) va descurcați sa faceți desenu
  6.  
  7. // (b)
  8.  
  9. struct Nod {
  10.     int info;
  11.     int nrFii;
  12.     Nod** adrFii;
  13. };
  14. Nod* creareArbore(int* parinte, int nr) {
  15.     Nod** noduri = new Nod*[nr];
  16.     Nod* radacina = nullptr;
  17.     for (int i = 0; i < nr; ++i) {
  18.         noduri[i] = new Nod;
  19.         noduri[i]->info = i;
  20.     }
  21.     for (int i = 0; i < nr; ++i) {
  22.         Nod* n = noduri[i];
  23.         if (parinte[i] == -1) radacina = n;
  24.         //am putea sa numaram cati fii are, da e mai simplu asa
  25.         // (putem avea maxim nr-1 fii)
  26.         n->adrFii = new Nod*[nr - 1];
  27.         for (int j = 0; j < nr; ++j) {
  28.             if (parinte[j] == i) {
  29.                 n->adrFii[n->nrFii] = noduri[j];
  30.                 n->nrFii++;
  31.             }
  32.         }
  33.     }
  34.     delete[] noduri;
  35.     return radacina;
  36. }
  37. //se poate si folosind liste inlantuite, dar e mai scurt asa
  38. Nod** coada;
  39. int vfCoada = 0;
  40. int sfCoada = 0;
  41. void adaugareCoada(Nod* n) {
  42.     coada[sfCoada] = n;
  43.     sfCoada++;
  44. }
  45.  
  46. Nod* stergereCoada() {//suna dubios
  47.     Nod* n = coada[vfCoada];
  48.     ++vfCoada;
  49.     return n;
  50. }
  51. bool coadaAreElemente() {
  52.     return vfCoada != sfCoada;
  53. }
  54.  
  55. void afisareNivele(Nod* rad) {
  56.     vfCoada = 0;
  57.     sfCoada = 0;
  58.     adaugareCoada(rad);
  59.     while (coadaAreElemente()) {
  60.         Nod* n = stergereCoada();
  61.         cout << n->info << " ";
  62.         for (int i = 0; i < n->nrFii; ++i)
  63.             adaugareCoada(n->adrFii[i]);
  64.     }
  65.     cout << endl;
  66. }
  67. // (c)
  68. void afisareNoduriTerminale(Nod* n) {
  69.     if (n->nrFii == 0) {
  70.         cout << n->info << " ";
  71.     } else {
  72.         for (int i = 0; i < n->nrFii; ++i)
  73.             afisareNoduriTerminale(n->adrFii[i]);
  74.     }
  75. }
  76. //(d)
  77. Nod* stanga(Nod *n) {
  78.     if (n->nrFii == 0) return nullptr;
  79.     return n->adrFii[0];
  80. }
  81.  
  82. Nod* dreapta(Nod *n) {
  83.     if (n->nrFii <= 1) return nullptr;
  84.     return n->adrFii[1];
  85. }
  86. bool esteBinar(Nod* n) {
  87.     if (n->nrFii > 2) return false;
  88.     for (int i = 0; i < n->nrFii; i++) {
  89.         if (!esteBinar(n->adrFii[i])) return false;
  90.     }
  91.     return true;
  92. }
  93. int max(int a, int b){
  94.     return a>b ? a:b;}
  95. int inaltime(Nod* p) {
  96.     if(p==0) return -1;
  97.     int hs=inaltime(stanga(p));
  98.     int hd=inaltime(dreapta(p));
  99.     return max(hs,hd)+1;
  100. }
  101.  
  102. bool esteEchilibrat(Nod* n) {
  103.     if (n == nullptr) return true;
  104.     if (!esteEchilibrat(stanga(n))) return false;
  105.     if (!esteEchilibrat(dreapta(n))) return false;
  106.     int factor = inaltime(dreapta(n)) - inaltime(stanga(n));
  107.     return factor >= -1 && factor <= 1;
  108. }
  109. bool esteAVL(Nod* n) {
  110.     if (!esteBinar(n)) return false;
  111.     return esteEchilibrat(n);
  112. }
  113. int main() {
  114.     // (b)
  115.     //presupunand ca indexarea incepe de la 0 (cum ar trebui)
  116.     //               0, 1, 2, 3, 4, 5, 6, 7, 8
  117.     int parinte[] = {1, 3, 1,-1, 5, 3, 7, 5, 7};
  118.     int nr = 9;
  119.     Nod* radacina = creareArbore(parinte, nr);
  120.     coada = new Nod*[nr];
  121.     afisareNivele(radacina);
  122.     // (c)
  123.     cout << "Persoane disponibilizate: ";
  124.     afisareNoduriTerminale(radacina);
  125.     cout << endl;
  126.     // (d)
  127.     if (esteAVL(radacina)) {
  128.         cout << "Este avl"<< endl;
  129.     } else {
  130.         cout << "Nu este avl"<< endl;
  131.     }
  132.     return 0;
  133. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement