Cuprins

Racket: Arbori binari

Descriere

Un arbore combină avantajele oferite de alte două structuri de date: tablourile și listele înlănțuite. Arborii permit, pe de o parte, executarea unor căutări rapide, la fel ca și tablourile ordonate, iar, pe de altă parte, inserarea și ștergerea elementelor sunt operații rapide, la fel ca în cazul unei liste simplu înlănțuite.

Această temă dorește să vă introducă în vasta lume a arborilor și vă propune spre analiză și implementare o metodă de reprezentare a mulțimilor, folosind arbori binari de căutare, precum și o serie de operații specifice acestora.

Reprezentarea internă a arborelui binar de căutare va fi la alegere, însă va trebui să implementați corespunzător setul de funcții de acces.

Fazele pe care trebuie sa le aveti in vedere pentru realizarea acestei teme sunt urmatoarele:

Cerințe

Construcția arborelui - 30 de puncte

Pentru a putea utiliza un arbore binar de căutare în reprezentarea unei mulțimi, va trebui să definiți o serie de operații. Astfel, pentru început, veți defini funcțiile enumerate în fișierul binary-tree.rkt pentru task-ul pregătitor.

În continuare, se va descriere funcționalitatea fiecarei funcții.

Pentru testarea acestor funcții, se va defini (manual) arborele de mai jos, în fișierul binary-tree.rkt. Acesta va avea ca identificator binary-search-tree.

Operații cu mulțimi - 50 de puncte

Principalele operații cu mulțimi sunt:

Implementați aceste operații pentru mulțimi reprezentate folosind arbori binari de căutare.

Un arbore este neechilibrat dacă rădăcina are mai mulți descendenți stângi decât drepți sau invers. De obicei, arborii neechilibrați rezultă în urma unui proces de inserare a nodurilor cu valori ordontate (crescător / descrescător). În cazul unui arbore binar de căutare neechilibrat, operațiile nu mai sunt eficiente. Având în vedere că în cadrul acestei teme folosim arborii pentru reprezentarea mulțimilor care sunt ordonate, șansele ca arborele pe care dorim să îl realizăm să rezulte neechilibrat sunt foarte mari. De aceea, va trebui să utilizați arbori binari pentru care diferența dintre înălțimea subarborelui stâng și a subarborelui drept este -1, 0 sau 1 (Arbori AVL). Pentru a implementa un astfel de arbore, va trebui să realizați o serie de rotații specifice la fiecare modificare a arborelui (inserarea unui element, ștergerea unui element).

Observație: În cazul funcției balance NU este permisă reconstrucția unui nou arbore, introducând nodurile în așa fel încât rezultatul să fie un arbore echilibrat. Pentru a înțelege mai bine cum trebuie să echilibrați arborele, puteți folosi animația de aici.

Submulțimi - 20 de puncte

Având o mulțime, reprezentată folosind un arbore binar de căutare, dorim sa determinăm toate submulțimile acesteia, ce au cardinalul k.

Numim submulțime zig-zag o submulțime A = {x1, x2, x3, … } pentru care x1 < x2 > x3 < … sau x1 > x2 < x3 > …. Implementați funcția care determină toate submulțimile maximale, ca număr de elemente, zig-zag ale unei mulțimi.

Bonus - 20 de puncte

In matematică, o expresie aritmetică este reprezentată printr-un șir de caractere compus din: variabile, constante, operatori și paranteze. O astfel de expresie aritmetică poate fi reprezentată printr-un arbore binar. Nodul rădăcină conține un operator, iar fiecare din subarborii săi reprezintă fie numele unei variabile sau unei constante, fie o altă expresie. În arborele binar asociat unei expresii nu apar parantezele. Pentru operațiile comutative, ordinea subarborilor stâng și drept nu contează, aceștia pot fi inversați, iar arborele este bine construit. În cazul operațiilor necomutative, ordinea subarborilor este strict precizată, adică subarborii nu pot fi inversați în reprezentare. În general, arborele binar asociat unei expresii nu este unic.

Construiți arborele sintactic pentru o expresie dată în forma infixată și evaluați expresia pe baza acestei reprezentări.

Exemplu

Precizări

Resurse

Changelog