Differences

This shows you the differences between two versions of the page.

Link to this comparison view

sd-ca:laboratoare:laborator-10 [2015/05/09 22:40]
cosmin_ioan.petrisor [Laborator 10 - Arbori Binari de Cautare]
sd-ca:laboratoare:laborator-10 [2015/05/15 08:13] (current)
andrei.vasiliu2211 [Exerciții]
Line 1: Line 1:
-====== Laborator 10 - Arbori Binari de Cautare======+====== Laborator 10 - Arbori Binari de Căutare======
 Responsabili:  ​ Responsabili:  ​
   * [[mihai.mneacsu@gmail.com|Mihai Neacşu]]   * [[mihai.mneacsu@gmail.com|Mihai Neacşu]]
Line 7: Line 7:
  
 În urma parcurgerii laboratorului,​ studentul va fi capabil să: În urma parcurgerii laboratorului,​ studentul va fi capabil să:
-  *să înţeleagă structura şi proprietățile unui arbore binar de căutare +  *înţeleagă structura şi proprietățile unui arbore binar de căutare 
-  *să construiască,​ în limbajul C++, un arbore binar de căutare +  *construiască,​ în limbajul C++, un arbore binar de căutare 
-  *să realizeze o parcurgere a structurii de date prin mai multe moduri +  *realizeze o parcurgere a structurii de date prin mai multe moduri 
-  *să realizeze diferite operaţii folosind arborii binari de căutare+  *realizeze diferite operaţii folosind arborii binari de căutare
  
 ===== Noțiuni teoretice ===== ===== Noțiuni teoretice =====
  
  
-Un arbore binar de căutare este un arbore binar care are în plus urmatoarele ​proprietăți: ​+Un arbore binar de căutare este un arbore binar care are în plus următoarele ​proprietăți: ​
   * cheile stocate în noduri (informația utilă) aparțin unei mulțimi peste care există o relație de ordine   * cheile stocate în noduri (informația utilă) aparțin unei mulțimi peste care există o relație de ordine
-  * cheia din oricare ​nod este mai mare decât cheile tuturor nodurilor din subarborele stâng ​ +  * cheia dintr-un ​nod oarecare ​este **mai mare** decât cheile tuturor nodurilor din subarborele stâng ​şi este **mai mică** decât cheile ​tuturor ​nodurilor ce compun subarborele drept
-  * cheia din oricare nod este mai mică decât cheile nodurilor ce compun subarborele drept+
  
 Arborii binari de căutare permit menţinerea datelor în ordine şi o căutare rapidă a unei chei, ceea ce îi recomandă pentru implementarea de mulţimi şi dicţionare ordonate. Arborii binari de căutare permit menţinerea datelor în ordine şi o căutare rapidă a unei chei, ceea ce îi recomandă pentru implementarea de mulţimi şi dicţionare ordonate.
  
-O importantă ​carcteristica ​a arborilor de căutare, este aceea că parcurgerea ​în inordine produce o secventa ​ordonată crescător a cheilor din nodurile arborelui.+O importantă ​carcteristică ​a arborilor de căutare, este aceea că parcurgerea ​''​inordine'' ​produce o secvenţă ​ordonată crescător a cheilor din nodurile arborelui.
  
-**Valoarea maximă** dintr-un arbore binar de căutare se află în **nodul din extremitatea dreaptă** şi se determină prin coborârea pe subarborele drept, iar **valoarea minimă** se află în **nodul din extremitatea stângă**.+**Valoarea maximă** dintr-un arbore binar de căutare se află în **nodul din extremitatea dreaptă** şi se determină prin coborârea pe subarborele drept, iar **valoarea minimă** se află în **nodul din extremitatea stângă**, determinarea fiind simetrică.
  
-**Căutarea** unei chei într-un arbore binar de căutare este asemănătoare căutării binare: cheia căutată este comparată cu cheia din nodul curent (iniţial nodul rădăcină). ​In funcţie de rezultatul comparaţiei apar trei cazuri: +**Căutarea** unei chei într-un arbore binar de căutare este asemănătoare căutării binare: cheia căutată este comparată cu cheia din nodul curent (iniţial nodul rădăcină). ​În funcţie de rezultatul comparaţiei apar trei cazuri: 
-  * acestea coincid – elementul a fost găsit +  * acestea coincid –elementul a fost găsit 
-  * elementul căutat este mai mic decât cheia din nodul curent – atunci ​căutarea continuă în subarborele stâng +  * elementul căutat este mai mic decât cheia din nodul curent –căutarea continuă în subarborele stâng 
-  * elementul căutat este mai mare decât cheia din nodul curent - atunci ​căutarea continuă în subarborele drept+  * elementul căutat este mai mare decât cheia din nodul curent -căutarea continuă în subarborele drept
  
 **Inserarea** unui nod se face, în funcţie de rezultatul comparaţiei cheilor, în subarborele stâng sau drept. Dacă arborele este vid, se creează un nod care devine nodul rădăcină al arborelui. În caz contrar, cheia se inserează ca fiu stâng sau fiu drept al unui nod din arbore. **Inserarea** unui nod se face, în funcţie de rezultatul comparaţiei cheilor, în subarborele stâng sau drept. Dacă arborele este vid, se creează un nod care devine nodul rădăcină al arborelui. În caz contrar, cheia se inserează ca fiu stâng sau fiu drept al unui nod din arbore.
  
-**Ștergerea** unui nod este o operaţie mai complicată,​ întrucât presupune o rearanjare a nodurilor. Pentru eliminarea unui nod dintr-un arbore binar de căutare sunt posibile următoare cazuri: +**Ștergerea** unui nod este o operaţie ​puţin ​mai complicată,​ întrucât presupune o rearanjare a nodurilor. Pentru eliminarea unui nod dintr-un arbore binar de căutare sunt posibile următoare cazuri: 
-  * nodul de şters nu existăoperaţia se consideră încheiată  +  * nodul de şters nu există ​-> operaţia se consideră încheiată  
-  * nodul de şters nu are succesori ​(este o frunză)+  * nodul de şters nu are succesori ​-> este o frunză
   * nodul de şters are un singur successor   * nodul de şters are un singur successor
   * nodul de şters are doi succesori   * nodul de şters are doi succesori
-În cazul ştergerii unui nod frunză sau a unui nod având un singur successor, legătura de la parintele nodului de şters este înlocuită prin legătura nodului de şters la succesorul său (care poate fi NULL). 
  
-Eliminarea unui nod cu doi succesori se face prin înlocuirea sa cu nodul care are cea mai apropiată valoare de nodul şters. Acesta poate fi nodul din extremitatea dreaptă a subarborelui stâng sau nodul din extremitatea stânga a subarborelui drept (este fie predecesorul,​ fie succesorul ​în ordine infixată). Acest nod are cel mult un successor.+<note tip> 
 +În cazul ştergerii unui nod frunză sau a unui nod având un singur successor, legătura de la părintele nodului de şters este înlocuită prin legătura nodului de şters la succesorul său (**NULL** în cazul frunzelor). 
 + 
 +Eliminarea unui nod cu doi succesori se face prin înlocuirea sa cu nodul care are cea mai apropiată valoare de nodul şters. Acesta poate fi nodul din extremitatea dreaptă a subarborelui stâng ​(**predecesorul**) ​sau nodul din extremitatea stânga a subarborelui drept (**succesorul**). Acest nod are cel mult un successor. 
 +</​note>​
  
 **Complexitatea** operaţiilor (căutare, inserare, ștergere) într-un arbore binar de căutare este - //pe cazul mediu// - **O(logn)**. **Complexitatea** operaţiilor (căutare, inserare, ștergere) într-un arbore binar de căutare este - //pe cazul mediu// - **O(logn)**.
Line 70: Line 72:
 #endif // __BINARY_SEARCH_TREE_H #endif // __BINARY_SEARCH_TREE_H
 </​code>​ </​code>​
-===== Exercitii ​=====+===== Exerciții ​=====
  
-Acest laborator se va realiza pornind de la **{{sd-ca:​laboratoare:​lab09-tasks.zip}}**. Observații privind scheletul de cod:+Acest laborator se va realiza pornind de la **{{sd-ca:​laboratoare:​labbst-tasks.zip|scheletul de cod}}**. 
 + 
 +Observații privind scheletul de cod:
   * Scheletul citește N numere dintr-un fișier dat ca parametru în linia de comandă.   * Scheletul citește N numere dintr-un fișier dat ca parametru în linia de comandă.
-  * Aceste N numere sunt introduse într-un arbore binar de căutare, funcționalitate pe care voi trebuie sa o codați  +  * Aceste N numere sunt introduse într-un arbore binar de căutare, funcționalitate pe care voi trebuie sa o implementaţi. 
-  * Clasa '​BinarySearchTree'​ conține un membru de tip pointer către Tpentru a defini dacă nodul rădăcină este gol sau nu. Astfel putem verifica dacă un BinarySearchTree conține minim un element (vezi funcția ''​isEmpty''​) +  * Clasa ''​BinarySearchTree'' conține un membru de tip pointer către T pentru a reţine informaţia utilă şi de asemenea pentru a putea determina mai simplu cazul contrar. Astfel putem verifica dacă un BinarySearchTree conține minim un element (vezi funcția ''​isEmpty''​). 
-  * Funcția '​removeKey'​ întoarce adresa noului nod rădăcină,​ dacă s-a șters vechea rădăcină.+  * Funcția ​''​removeKey'' întoarce adresa noului nod rădăcină,​ dacă s-a șters vechea rădăcină.
  
-  - [**3p**] Implementați următoarele funcționalități de bază ale unui arbore binar de căutare: +1. [**3p**] Implementați următoarele funcționalități de bază ale unui arbore binar de căutare: 
-    ​[**0.5p**] constructor (TODO 1.1) +    ​[**0.5p**] constructor(TODO 1.1)  
-    ​[**0.5p**] destructor ​(TODO 1.2). Eliberați toată memoria alocată. +    ​[**0.5p**] destructor. Eliberați toată memoria alocată. ​(TODO 1.2) 
-    ​[**0.5p**] adăugare elemente în arbore(TODO 1.3) +    ​[**0.5p**] adăugare elemente în arbore.(TODO 1.3) 
-    ​[**0.5p**] căutare elemente în arbore (TODO 1.4) +    ​[**0.5p**] căutare elemente în arbore(TODO 1.4) 
-    ​[**1p**] parcurgere inordine arbore (TODO 1.5) +    ​[**1p**] parcurgere inordine arbore(TODO 1.5)
-  - [**2p**] Implementați următoarele funcționalități avansate ale unui arbore binar de căutare: +
-    - [**0.5p**] funcții pentru returnare valoare minimă/​maximă din arbore. Implementaţi eficient, ţinând cont de faptul ca arborele binar este unul de căutare ​ (TODO 2.1). <code c++> +
-T findMin ();+
  
 +2. [**2p**] Implementați următoarele funcționalități avansate ale unui arbore binar de căutare:
 +    * [**0.5p**] funcții pentru returnare valoare minimă/​maximă din arbore. Implementaţi eficient, ţinând cont de faptul ca arborele binar este unul de căutare. (TODO 2.1)
 +<code c++>
 +T findMin ();
 T findMax (); T findMax ();
 </​code>​ </​code>​
-    ​[**0.5p**] ​calculeaza si returnează ​înalțimea unui arbore. Înălțimea unui arbore se calculează adunând 1 la înălțimea maximă a subarborelui său stâng și a celui drept. (TODO 2.2)<code c++>+    ​[**0.5p**] ​calculează şi returnează ​înălțimea unui arbore. Înălțimea unui arbore se calculează adunând 1 la înălțimea maximă a subarborelui său stâng și a celui drept. (TODO 2.2) 
 +<code c++>
 int findLevels();​ int findLevels();​
 </​code>​ </​code>​
-    ​[**1p**] funcție pentru ​ afișarea cheilor (informațiilor utile) din nodurile situate pe un anumit nivel primit ca parametru ​(nivel ​= distanța de la un nod la rădăcina; nivelul rădăcinii ​este 0)(TODO 2.3)<code c++>+    ​[**1p**] funcție pentru ​ afișarea cheilor (informației utile) din nodurile situate pe un anumit nivel primit ca parametru. Nivel = distanța de la rădăcină la un nod, nivelul rădăcinii ​fiind 0(TODO 2.3) 
 +<code c++>
 void displayLevel(int level); void displayLevel(int level);
 </​code>​ </​code>​
-  - [**3p**] Implementați funcția de ștergere a unui element. **Atenție**. Trebuie să tratați și cazul în care se va șterge elementul din rădăcină. (TODO 3.1) 
  
-<hidden>+3. Implementați următoarele funcționalități avansate ale unui arbore binar de căutare: 
 +    - [**3p**]Definim noţiunea de 'calea de la rădacină la frunze'​ ca fiind o secvenţă de noduri ce începe cu nodul rădacină şi coboară spre un nod frunză. Pentru fiecare astfel de cale din arbore însumaţi valorile din noduri. Afişaţi în ordine descrescătoare sumele obţinute pentru fiecare cale din arbore de la rădăcină la frunze. Implementaţi eficient, ţinând cont de faptul ca arborele binar este unul de căutare complet. (TODO 3) 
 +<code>
  
-  - Implementați următoarele funcționalități avansate ale unui arbore binar de căutare: +               ​15 ​           ​ 
-    ​- [**1p**] funcții pentru returnare valoare minimă/maximă din arbore. Implementaţi eficient, ţinând cont de faptul ca arborele binar este unul de căutare ​ (TODO 2.1). <code c++> +             /    \                                     
-T findMin (); +           ​10 ​     20                                      
- +           / ​     ​/  ​\                                    
-T findMax ();+          ​4 ​     17   ​23 ​                                 
 +         / \    /  \    \ 
 +        ​2 ​  ​6 ​ 16  19   32
 </​code>​ </​code>​
-    - [**1p**] calculeaza si returnează înalțimea unui arbore. Înălțimea unui arbore se calculează adunând 1 la înălțimea maximă a subarborelui său stâng ​șcelui drept. (TODO 2.2). <code c++> + 
-int findLevels();​ +4. [**3p**] Implementați funcția de ștergere ​unui element. (TODO 4
-</code+<note important
-    - [**2p**] funcție pentru ​ afișarea cheilor (informațiilor utile) ​din nodurile situate pe un anumit nivel primit ca parametru (nivel = distanța de la un nod la rădăcina; nivelul rădăcinii este 0)(TODO 2.3). <code c+++Trebuie să tratațși cazul în care se va șterge elementul ​din rădăcină. 
-void displayLevel(int level); +</note
-</code+ 
-    - [**3p**]Definim noţiunea de 'calea de la rădacină la frunze'​ ca fiind o secvenţă de noduri ce începe cu nodul rădacină şi coboară spre un nod frunză. Pentru fiecare astfel de cale din arbore însumaţi valorile din noduri. Afişaţi în ordine descrescătoare sumele obţinute pentru fiecare cale din arbore de la rădăcină la frunze. Implementaţi eficient, ţinând cont de faptul ca arborele binar este unul de căutare complet. (TODO 2.4) <​code>​+<hidden> 
 +3. Implementați următoarele funcționalități avansate ale unui arbore binar de căutare: 
 +    - [**3p**]Definim noţiunea de 'calea de la rădacină la frunze'​ ca fiind o secvenţă de noduri ce începe cu nodul rădacină şi coboară spre un nod frunză. Pentru fiecare astfel de cale din arbore însumaţi valorile din noduri. Afişaţi în ordine descrescătoare sumele obţinute pentru fiecare cale din arbore de la rădăcină la frunze. Implementaţi eficient, ţinând cont de faptul ca arborele binar este unul de căutare complet. (TODO 3) 
 +<​code>​
  
                ​15 ​           ​                ​15 ​           ​
Line 122: Line 135:
         2   ​6 ​ 16  19   32         2   ​6 ​ 16  19   32
 </​code>​ </​code>​
-  - [**3p**] Implementați funcția de ștergere a unui element. **Atenție**. Trebuie să tratați și cazul în care se va șterge elementul din rădăcină. (TODO 3.1) 
-</​hidden>​ 
  
  
 +3. Implementați următoarele funcționalități avansate ale unui arbore binar de căutare:
 +    - [**3p**]Definim noţiunea de 'calea de la rădacină la frunze'​ ca fiind o secvenţă de noduri ce începe cu nodul rădacină şi coboară spre un nod frunză. Pentru fiecare astfel de cale din arbore însumaţi valorile din noduri. Afişaţi în ordine descrescătoare sumele obţinute pentru fiecare cale din arbore de la rădăcină la frunze. Implementaţi eficient, ţinând cont de faptul ca arborele binar este unul de căutare complet. (TODO 3)
 +<​code>​
 +
 +               ​15 ​           ​
 +             / ​   \                                    ​
 +           ​10 ​     20                                     
 +           / ​     /  \                                   
 +          4      17   ​23 ​                                
 +         / \    /  \    \
 +        2   ​6 ​ 16  19   32
 +</​code>​
  
-           +</​hidden>​  
 +          ​
sd-ca/laboratoare/laborator-10.1431200416.txt.gz · Last modified: 2015/05/09 22:40 by cosmin_ioan.petrisor
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0