Responsabili:
În urma parcurgerii laboratorului, studentul va fi capabil să:
Un arbore binar de căutare este un arbore binar care are în plus următoarele proprietăți:
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ă 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ă, 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ă). În funcţie de rezultatul comparaţiei apar trei cazuri:
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 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:
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.
Complexitatea operaţiilor (căutare, inserare, ștergere) într-un arbore binar de căutare este - pe cazul mediu - O(logn).
#ifndef __BINARY_SEARCH_TREE__H #define __BINARY_SEARCH_TREE__H template <typename T> class BinarySearchTree { public: BinarySearchTree(); ~BinarySearchTree(); void insertKey(T x); void removeKey(T x); BinarySearchTree<T>* searchKey(T x); void inOrderDisplay(); private: BinarySearchTree<T> *leftNode; BinarySearchTree<T> *rightNode; BinarySearchTree<T> *parent; T *pData; }; #endif // __BINARY_SEARCH_TREE_H
Acest laborator se va realiza pornind de la scheletul de cod.
Observații privind scheletul de cod:
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
).removeKey
întoarce adresa noului nod rădăcină, dacă s-a șters vechea rădăcină.1. [3p] Implementați următoarele funcționalități de bază ale unui arbore binar de căutare:
2. [2p] Implementați următoarele funcționalități avansate ale unui arbore binar de căutare:
T findMin (); T findMax ();
int findLevels();
void displayLevel(int level);
3. Implementați următoarele funcționalități avansate ale unui arbore binar de căutare:
15 / \ 10 20 / / \ 4 17 23 / \ / \ \ 2 6 16 19 32
4. [3p] Implementați funcția de ștergere a unui element. (TODO 4)