Advertisement
Tucancitto

Lab3 - Pb5

Apr 9th, 2021 (edited)
56
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.50 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3. #include <cstring>
  4. #include <vector>
  5. using namespace std;
  6.  
  7. constexpr auto SPATIU = 5;
  8.  
  9. struct PERECHE
  10. {
  11.     char caract = NULL;
  12.     vector<char> cod;
  13. };
  14.  
  15. struct PERECHI
  16. {
  17.     vector<PERECHE> caractCod;
  18.     void citirePerechi()
  19.     {
  20.         ifstream fin("coduri.in");
  21.         if (fin.peek() == EOF) {
  22.             cout << "Fisierul este vid. \n";
  23.             return;
  24.         }
  25.  
  26.         int nrPerechi;
  27.         fin >> nrPerechi;
  28.         if (!nrPerechi) {
  29.             cout << "Numarul de perechi este nul. \n";
  30.             return;
  31.         }
  32.         caractCod.resize(nrPerechi);
  33.  
  34.         char c;
  35.         fin >> c;
  36.         caractCod[0].caract = c;
  37.  
  38.         for (int index = 0; index < nrPerechi; ++index)
  39.         {
  40.             while (fin >> c)
  41.             {
  42.                 if (isdigit(c))
  43.                     caractCod[index].cod.push_back(c);
  44.                 else
  45.                     break;
  46.             }
  47.             if (index + 1 < nrPerechi)
  48.                 caractCod[index + 1].caract = c;
  49.         }
  50.  
  51.         fin.close();
  52.     }
  53.  
  54.     void afisarePerechi()
  55.     {
  56.         for (int index = 0; index < caractCod.size(); ++index)
  57.         {
  58.             cout << caractCod[index].caract << ' ';
  59.             for (int index2 = 0; index2 < caractCod[index].cod.size(); ++index2)
  60.                 cout << caractCod[index].cod[index2];
  61.             cout << endl;
  62.         }
  63.     }
  64. };
  65.  
  66. struct NOD
  67. {
  68.     char info = 'N';
  69.     NOD* st = NULL, * dr = NULL;
  70. };
  71.  
  72. struct ARBORE
  73. {
  74.     NOD* radacina = new NOD;
  75.  
  76.     bool empty()
  77.     {
  78.         if (radacina == NULL)
  79.             return true;
  80.         return false;
  81.     }
  82.  
  83.     NOD* inserareNOD(NOD*& nod)
  84.     {
  85.         NOD* nou = new NOD;
  86.         nod = nou;
  87.         return nou;
  88.     }
  89.  
  90.     void formareArbore(vector<PERECHE> caractCod)
  91.     {
  92.         for (int index = 0; index < caractCod.size(); ++index)
  93.         {
  94.             NOD* nod = new NOD;
  95.             nod = radacina;
  96.  
  97.             for (int index2 = 0; index2 < caractCod[index].cod.size(); ++index2)
  98.                 if (caractCod[index].cod[index2] == '0')
  99.                 {
  100.                     if (nod->st == NULL)
  101.                         nod = inserareNOD(nod->st);
  102.                     else
  103.                         nod = nod->st;
  104.                 }
  105.                 else
  106.                 {
  107.                     if (nod->dr == NULL)
  108.                         nod = inserareNOD(nod->dr);
  109.                     else
  110.                         nod = nod->dr;
  111.                 }
  112.  
  113.             nod->info = caractCod[index].caract;
  114.         }
  115.     }
  116.  
  117.     int inaltime(NOD* rad)
  118.     {
  119.         if (rad == NULL)
  120.             return -1;
  121.  
  122.         int inaltimeSt = inaltime(rad->st);
  123.         int inaltimeDr = inaltime(rad->dr);
  124.  
  125.         return max(inaltimeSt, inaltimeDr) + 1;
  126.     }
  127.  
  128.     void afisareNivel(NOD* rad, int nivel)
  129.     {
  130.         if (rad == NULL)
  131.             return;
  132.  
  133.         if (nivel == 0)
  134.             cout << rad->info << ' ';
  135.         else
  136.         {
  137.             afisareNivel(rad->st, nivel - 1);
  138.             afisareNivel(rad->dr, nivel - 1);
  139.         }
  140.     }
  141.  
  142.     void BFS()
  143.     {
  144.         int h = inaltime(radacina);
  145.         for (int nivel = 0; nivel <= h; ++nivel)
  146.             afisareNivel(radacina, nivel);
  147.         cout << endl;
  148.     }
  149.  
  150.     void afisareArbore(NOD* rad, int spatiu)
  151.     {
  152.         if (rad == NULL)
  153.             return;
  154.         spatiu += SPATIU;
  155.  
  156.         afisareArbore(rad->dr, spatiu);
  157.         cout << endl;
  158.  
  159.         for (int index = SPATIU; index < spatiu; cout << "  ", ++index);
  160.  
  161.         cout << rad->info;
  162.         afisareArbore(rad->st, spatiu);
  163.     }
  164.  
  165.     void stergereArbore(NOD*& rad)
  166.     {
  167.         if (rad == NULL)
  168.             return;
  169.  
  170.         stergereArbore(rad->st);
  171.         stergereArbore(rad->dr);
  172.  
  173.         delete rad;
  174.         rad = nullptr;
  175.     }
  176. };
  177.  
  178. int main()
  179. {
  180.     PERECHI perechi;
  181.     perechi.citirePerechi();
  182.     if (perechi.caractCod.empty())
  183.         return 0;
  184.  
  185.     cout << "Perechile citite din fisier: \n";
  186.     perechi.afisarePerechi();
  187.  
  188.     ARBORE arbore;
  189.     if (!arbore.empty())
  190.     {
  191.         arbore.formareArbore(perechi.caractCod);
  192.         arbore.afisareArbore(arbore.radacina, 0);
  193.  
  194.         cout << endl << endl;
  195.         arbore.BFS();
  196.     }
  197.     else
  198.         cout << "Arborele este vid. \n";
  199.  
  200.     perechi.caractCod.clear();
  201.     perechi.caractCod.shrink_to_fit();
  202.     arbore.stergereArbore(arbore.radacina);
  203.  
  204.     return 0;
  205. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement