Advertisement
KillerBananaZ

Arbori binari de cautare

May 10th, 2017
416
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.19 KB | None | 0 0
  1.     Arbori binari de cautare
  2.  
  3. Definitie: Se numeste arbore binar de cautare un arbore binar cu proprietatea ca toate elementele mai mici decat valoarea din nod se gasesc in subarborele stang, iar toate elementele mai mari decat valoarea asociata nodului se gasesc in subarborele drept.
  4.  
  5. Exemplu:   
  6.             6
  7.         3       8
  8.       1   4   7   9
  9.       2   5
  10. Observatie: Prin parcurgerea in inordine a unui arbore binar de cautare, se obtin informatiile atasate nodurilor in ordine crescatoare.
  11.             Informatiile atasate nodurilor dintr-un arbore binar de cautare sunt distincte.
  12. Crearea unui arbore binar de cautare:
  13.    
  14.     struct nod
  15.                 {
  16.         tip_informatie inf;
  17.         [int ap];
  18.         nod *st,*dr;
  19.                 };
  20.     nod *rad;
  21.  
  22. Crearea arborelui binar de cautare se face prin adaugarea repetata a cate unui nod intr-un arbore initial vid.
  23.  
  24.     void adauga(nod*&p,tip_informatie x)
  25.     {
  26.         if(p==NULL)
  27.             {
  28.             p = new nod;
  29.             p->inf = x;
  30.             [p->ap = 1];
  31.             p->st=NULL;
  32.             p->dr=NULL;
  33.             }
  34.         else
  35.             {
  36.             if(x>p->inf)
  37.                 adauga(p->dr,x);
  38.             else
  39.                 if(x<p->inf)
  40.                     adauga(p->st,x);
  41.             [else p->ap++];
  42.             }
  43.     }
  44.    
  45.     void creare(nod*&p)
  46.     {
  47.     tip_inf x;
  48.     for(int i=1;i<=n;i++)
  49.     {
  50.         cin >> x;
  51.         adauga(p,x);
  52.     }
  53.     }
  54. APEL: rad=NULL;
  55.     creare(rad);
  56.  
  57. Aplicatie:
  58.     Fisierul date.in contine numere intregi scrise pe una sau mai multe linii. Creati un arbore binar de cautare care va contine in fiecare nod fiecare valoare din fisier, impreuna cu numarul sau de aparitii. Afisati valoarea care apare de cele mai multe ori in fisier.
  59.  
  60. #include <iostream>
  61. #include <fstream>
  62. using namespace std;
  63. ifstream f("arbore.in");
  64. struct nod
  65.         {
  66.         int inf;
  67.         int ap;
  68.         nod *st,*dr;
  69.         };
  70. nod *rad;
  71. int maxx=0,nr=0;
  72. void adauga(nod*&p,int x)
  73. {
  74.     if(p==NULL)
  75.         {
  76.         p = new nod;
  77.         p->inf = x;
  78.         p->ap = 1;
  79.         p->st=NULL;
  80.         p->dr=NULL;
  81.         }
  82.     else
  83.         {
  84.         if(x>p->inf)
  85.             adauga(p->dr,x);
  86.         else
  87.             if(x<p->inf)
  88.                 adauga(p->st,x);
  89.             else
  90.                 if(x==p->inf)
  91.                     p->ap++;
  92.         }
  93. }
  94. void creare(nod*&p)
  95. {
  96.     int x;
  97.     f >> x;
  98.     while(!f.eof())
  99.     {
  100.         adauga(p,x);
  101.         f >> x;
  102.     }
  103. }
  104. void afis(nod*p)
  105. {
  106.     if(p!=NULL)
  107.     {
  108.         afis(p->st);
  109.         cout << p->inf << " apare de " << p->ap << " ori." <<endl;
  110.         afis(p->dr);
  111.     }
  112. }
  113. void maxim(nod*p)
  114. {
  115.     if(p!=NULL)
  116.     {
  117.     if(p->ap>maxx)
  118.     {
  119.         maxx=p->ap;
  120.         nr=p->inf;
  121.     }
  122.     maxim(p->st);
  123.     maxim(p->dr);
  124.     }
  125. }
  126. void afismax(nod*p)
  127. {
  128.     if(p!=NULL)
  129.     {
  130.         if(p->ap==maxx)
  131.              cout << p->inf << " ";
  132.     afismax(p->st);
  133.     afismax(p->dr);
  134.     }
  135. }
  136. int main()
  137. {
  138.     rad=NULL;
  139.     creare(rad);
  140.     afis(rad);
  141.     maxim(rad);
  142.     cout << "Valorea maxima care a aparut in fisier este " << maxx << " si a aparut la nodurile: ";
  143.     afismax(rad);
  144.     return 0;
  145. }
  146.  
  147.  
  148. Aplicatie 2: Creati un arbore binar de cautare care va contine literele dintr-un cuvant, fara spatii intre ele. Afisati literele in ordine alfabetica si numarul de aparitii al fiecarei litere in sir dupa care creati o stiva care va contine vocalele din sirul dat. Afisati stiva obtinuta.
  149.  
  150. struct nods
  151.         {
  152.         tip_informatie inf;
  153.         nods*ant;
  154.         };
  155. void adaugas(nods*&vf,tip_informatie x)
  156. {
  157.     if(vf==NULL)
  158.         {
  159.         vf = new nods;
  160.         vf->inf=x;
  161.         vf->ant=NULL;
  162.         }
  163.     else
  164.         {
  165.         nods*p;
  166.         p = new nods;
  167.         p->inf=x;
  168.         p->ant=vf;
  169.         vf=p;
  170.         }
  171. }
  172.  
  173. Rezolvare:
  174. #include <iostream>
  175. #include <fstream>
  176. #include <string.h>
  177. using namespace std;
  178. struct nods
  179.         {
  180.         char inf;
  181.         nods*ant;
  182.         };
  183. struct nod
  184.         {
  185.         int inf;
  186.         int ap;
  187.         nod *st,*dr;
  188.         };
  189. nod*rad;
  190. nods*vf;
  191. ifstream f("vocale.in");
  192. char voc[]="aeiouAEIOU";
  193. void adaugas(nods*&vf,char x)
  194. {
  195.     if(vf==NULL)
  196.         {
  197.         vf = new nods;
  198.         vf->inf=x;
  199.         vf->ant=NULL;
  200.         }
  201.     else
  202.         {
  203.         nods*p;
  204.         p = new nods;
  205.         p->inf=x;
  206.         p->ant=vf;
  207.         vf=p;
  208.         }
  209. }
  210. void adauga(nod*&p,char x)
  211. {
  212.     if(p==NULL)
  213.         {
  214.         p = new nod;
  215.         p->inf = x;
  216.         p->ap = 1;
  217.         p->st=NULL;
  218.         p->dr=NULL;
  219.         }
  220.     else
  221.         {
  222.         if(x>p->inf)
  223.             adauga(p->dr,x);
  224.         else
  225.             if(x<p->inf)
  226.                 adauga(p->st,x);
  227.             else
  228.                 if(x==p->inf)
  229.                     p->ap++;
  230.         }
  231. }
  232. void creare(nod*&p)
  233. {
  234.     char x;
  235.     f >> x;
  236.     while(!f.eof())
  237.     {
  238.         adauga(p,x);
  239.         f >> x;
  240.     }
  241. }
  242. void afis(nod*p)
  243. {
  244.     if(p!=NULL)
  245.     {
  246.         afis(p->st);
  247.         cout << char(p->inf) << " apare de " << p->ap << " ori." <<endl;
  248.         afis(p->dr);
  249.     }
  250. }
  251. void crearestiva(nod*&p)
  252. {
  253.     if(p!=NULL)
  254.     {
  255.         crearestiva(p->st);
  256.         if(strchr(voc,p->inf)!=NULL)
  257.              adaugas(vf,p->inf);
  258.         crearestiva(p->dr);
  259.     }
  260. }
  261. void afis_s(nods*vf)
  262. {
  263.     nods*p;
  264.     p=vf;
  265.     while(p!=NULL)
  266.     {
  267.         cout << p->inf << " ";
  268.         p=p->ant;
  269.     }
  270. }
  271. int main()
  272. {
  273.     rad=NULL;
  274.     vf=NULL;
  275.     creare(rad);
  276.     cout << "Literele in ordine alfabetica sunt: "<<endl;
  277.     afis(rad);
  278.     crearestiva(rad);
  279.     cout << "Vocalele din sir sunt: ";
  280.     afis_s(vf);
  281. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement