APLICAŢII ELEMENTARE CU ARBORI

Similar documents
ARBORI AVL. (denumiti dupa Adelson-Velskii si Landis, 1962)

Arbori. Figura 1. struct ANOD { int val; ANOD* st; ANOD* dr; }; #include <stdio.h> #include <conio.h> struct ANOD { int val; ANOD* st; ANOD* dr; }

Structuri de date: ARBORI

HEAPSORT I. CONSIDERAŢII TEORETICE

Subiecte Clasa a VI-a

Procesarea Imaginilor

Grafuri bipartite. Lecție de probă, informatică clasa a XI-a. Mihai Bărbulescu Facultatea de Automatică și Calculatoare, UPB

Metrici LPR interfatare cu Barix Barionet 50 -

Titlul lucrării propuse pentru participarea la concursul pe tema securității informatice

Reflexia şi refracţia luminii. Aplicaţii. Valerica Baban

Structura și Organizarea Calculatoarelor. Titular: BĂRBULESCU Lucian-Florentin

Mircea Merca 1) Articol dedicat Prof. Dr. Ioan Tomescu la a 70-a aniversare

Algoritmi pentru regăsirea informaţiei

Versionare - GIT ALIN ZAMFIROIU

D în această ordine a.î. AB 4 cm, AC 10 cm, BD 15cm

Metoda BACKTRACKING. prof. Jiduc Gabriel

2. Setări configurare acces la o cameră web conectată într-un router ZTE H218N sau H298N

Semnale şi sisteme. Facultatea de Electronică şi Telecomunicaţii Departamentul de Comunicaţii (TC)

Ghid identificare versiune AWP, instalare AWP şi verificare importare certificat în Store-ul de Windows

Metoda de programare BACKTRACKING

Metode de acces la informatie în bazele de date pentru prelucrari grafice

Mecanismul de decontare a cererilor de plata

Olimpiad«Estonia, 2003

Dispozitive Electronice şi Electronică Analogică Suport curs 02 Metode de analiză a circuitelor electrice. Divizoare rezistive.

GHID DE TERMENI MEDIA

REVISTA NAŢIONALĂ DE INFORMATICĂ APLICATĂ INFO-PRACTIC

INFORMAȚII DESPRE PRODUS. FLEXIMARK Stainless steel FCC. Informații Included in FLEXIMARK sample bag (article no. M )

Modalitǎţi de clasificare a datelor cantitative

Vizualizarea documentelor xml

2. Tipul referinţă, structuri de date dinamice ( liste înlănţuite şi arbori binari).

9. Memoria. Procesorul are o memorie cu o arhitectură pe două niveluri pentru memoria de program și de date.

Textul si imaginile din acest document sunt licentiate. Codul sursa din acest document este licentiat. Attribution-NonCommercial-NoDerivs CC BY-NC-ND

C10. Structuri de date dinamice / Arbori binari 1/57

În continuare vom prezenta unele dintre problemele de calcul ale numerelor Fibonacci.

The First TST for the JBMO Satu Mare, April 6, 2018

Lucrarea de laborator nr. 4

Arbori sistolici binari

Update firmware aparat foto

MS POWER POINT. s.l.dr.ing.ciprian-bogdan Chirila

Auditul financiar la IMM-uri: de la limitare la oportunitate

Lecţii complementare de teoria grafurilor

Managementul referinţelor cu

Excel Advanced. Curriculum. Școala Informală de IT. Educație Informală S.A.

ISBN-13:

Updating the Nomographical Diagrams for Dimensioning the Concrete Slabs

CERERI SELECT PE O TABELA

Aspecte controversate în Procedura Insolvenţei şi posibile soluţii

The driving force for your business.

Platformă de e-learning și curriculă e-content pentru învățământul superior tehnic

CAIETUL DE SARCINI Organizare evenimente. VS/2014/0442 Euro network supporting innovation for green jobs GREENET

PROIECTAREA ALGORITMILOR

Mods euro truck simulator 2 harta romaniei by elyxir. Mods euro truck simulator 2 harta romaniei by elyxir.zip

INTELIGENŢĂ ARTIFICIALĂ

Laborator 2. Definirea tablourilor şi a funcţiilor (în linia de comandă) în Matlab 7.0

Baze de date distribuite și mobile

IV. PROGRAMAREA ORIENTATĂ PE OBIECTE

Procesarea Imaginilor - Laborator 5: Etichetarea componentelor conexe 1

INTEROGĂRI ÎN SQL SERVER

Itemi Sisteme de Operare

FIȘA DISCIPLINEI Total ore pe semestru Număr de credite 6

Nume şi Apelativ prenume Adresa Număr telefon Tip cont Dobânda Monetar iniţial final

X-Fit S Manual de utilizare

Cap.5 Normalizarea relaţiilor

Laborator 2 - Statistică descriptivă

Propuneri pentru teme de licență

CERERI SELECT PE MAI MULTE TABELE

Funcţii grup şi clauzele GROUP BY, HAVING. Operatorii ROLLUP şi CUBE.

La fereastra de autentificare trebuie executati urmatorii pasi: 1. Introduceti urmatoarele date: Utilizator: - <numarul dvs de carnet> (ex: "9",

Baze de date în Visual Fox Pro. Stabilirea relațiilor dintre tabele în cadrul bazei de date. Filtrarea, sortarea, indexarea, căutarea înregistrărilor.

MICROSOFT ACCESS 2007 (DE CĂUTAT???)

INSTRUMENTE DE MARKETING ÎN PRACTICĂ:

Capitolul 4 SUBCERERI. F. Radulescu. Curs: Baze de date - Limbajul SQL

Baze de date - Lucrare de laborator 3 -

APLICAŢIE INFORMATICĂ PENTRU PREGĂTIREA MISIUNILOR DE NIVEL TACTIC

2. In the pattern below, which number belongs in the box? 0,5,4,9,8,13,12,17,16, A 15 B 19 C 20 D 21

Candlesticks. 14 Martie Lector : Alexandru Preda, CFTe

Proiectarea Sistemelor Software Complexe

CHAMPIONS LEAGUE 2017 SPONSOR:

Class D Power Amplifiers

KAJOT V.RO BLACK PLANET JOC DE NOROC CU RISC LIMITAT

ARHITECTURA SISTEMELOR DE CALCUL ŞI SISTEME DE OPERARE. LUCRĂRILE DE LABORATOR Nr. 6, 7 şi 8 REPREZENTAREA INFORMAŢIILOR NUMERICE ÎNTREGI ŞI REALE.

Proiectarea bazelor de date. PL/SQL Înregistrări și Colecții # 13. Adrian Runceanu

Ce pot face pe hi5? Organizare si facilitati. Pagina de Home

Printesa fluture. Мобильный портал WAP версия: wap.altmaster.ru

Documentaţie Tehnică

Decizia manageriala în conditii de risc. Profilul riscului.

PACHETE DE PROMOVARE

Desenarea 3D in AutCAD Generarea suprafeţelor

INTELIGENŢĂ ARTIFICIALĂ

Cristina ENULESCU * ABSTRACT

5.1 Definirea datelor în SQL

1. Creaţi un nou proiect de tip Windows Forms Application, cu numele MdiExample.

Tema 1 - Transferuri de date DMA intr-o arhitectura de tip Cell

Prima. Evadare. Ac9vity Report. The biggest MTB marathon from Eastern Europe. 7th edi9on

Reţele Neuronale Artificiale în MATLAB

PROCEDURA PRIVIND DECONTURILE. 2. Domeniu de aplicare Procedura se aplică în cadrul Universităţii Tehnice Cluj-Napoca

Universitatea George Bariţiu, Braşov

Prof.univ.dr. Zenovic GHERASIM

MODELUL UNUI COMUTATOR STATIC DE SURSE DE ENERGIE ELECTRICĂ FĂRĂ ÎNTRERUPEREA ALIMENTĂRII SARCINII

Proceduri stocate. Crearea procedurilor stocate. Varianta 1 În Management Studio se dă clic pe New Query ca în imaginea de mai jos: Fig.

Transcription:

APLICAŢII ELEMENTARE CU ARBORI I. CONSIDERAŢII TEORETICE Din punct de vedere etimologic termenul de arbore a fost introdus de către matematicianul Arthur Cayley în 1857, plecând de la o analogie botanică. Structurile arborescente reprezintă structuri neliniare de date cu aplicaţii în programare, care exprimă relaţii de ramificare între noduri, asemănătoare configuraţiei arborilor din natură, cu deosebirea că în informatică arborii cresc în jos (au rădăcină în vârf). Se numeşte arbore un graf conex şi fără cicluri. REPREZENTAREA ARBORILOR CU RĂDĂCINĂ Prin structuri de date înlănţuite. Reprezentarea fiecărui nod al arborilor printr-un obiect. Pointerii către celelalte noduri pot varia în funcţie de tipul arborelui. Arbori binari Definiţie: Un arbore binar este o mulţime finită de noduri care este fie vidă, fie reprezintă un arbore ordonat în care fiecare nod are cel mult doi descendenţi (stâng şi drept). Un nod fără descendenţi se numeşte nod terminal sau frunză. Un arbore binar în care fiecare nod care nu este terminal are exact doi descendenţi se numeşte arbore binar complet. Un arbore binar complet care are n noduri terminale, toate situate pe acelaşi nivel, are în total 2n-1 noduri. Reprezentarea standard presupune memorarea pointerilor pentru părinte, pentru descendentul stâng şi descendentul drept al fiecărui nod din arbore. Dacă rădăcină(t) = NIL (sau NULL) arborele este vid. Rădăcină se află pe nivelul 0 al arborelui. Reprezentarea prin vector de TAŢI şi eventual prin vector de DESCENDENŢI. Vectorul TATĂ precizează pentru fiecare vârf i nodul TATĂ[i], care reprezintă părintele său în arbore (rădăcina subarborelui de care aparţine). Vectorul DESCENDENŢI indică prin valoarea -1 sau +1 dacă vârful i este descendentul stâng sau drept al părintelui său TATĂ[i]. Pentru rădăcina arborelui TATĂ[rădăcină]=0 şi DESCENDENŢI[rădăcină]=0. Arbori cu rădăcină cu număr nelimitat de ramuri Schema reprezentării arborilor binari poate fi extinsă la orice clasă de arbori în care numărul de descendenţi ai fiecărui nod nu depăşeşte o constantă k (din motive de alocare şi reprezentare). Dacă numărul descendenţilor este mărginit de o constantă mare şi majoritatea nodurilor au un număr mic de descendenţi se va irosi multă memorie. Reprezentarea descendent-stâng, frate-drept - schemă "inteligentă" pentru folosirea arborilor binari la reprezentarea arborilor cu număr arbitrar de descendenţi. Utilizează un spaţiu de O(n) pentru orice arbore cu rădăcină şi cu n noduri. Fiecare nod conţine un pointer spre părinte p. Nu există decât doi pointeri spre descendenţi: fiu-stâng[x] referă cel mai din stânga descendent al nodului x şi frate-drepţ[x] referă fratele lui x, cel mai apropiat spre dreapta. Dacă nodul x nu are descendenţi atunci fiu-stâng[x] = NIL, iar dacă nodul x este cel mai din dreapta descendent al părintelui său atunci frate-drept[x] = NIL.

Alte reprezentări ale arborilor Prin ansambluri (heap - arbore binar complet într-un singur tablou plus un indice. Prin păstrarea doar a pointerilor spre părinţi; nu există pointeri spre descendenţi. Arborii sunt traversaţi numai spre rădăcină. ARBORI BINARI DE CĂUTARE Sunt structuri de date înlănţuite (în care fiecare nod este un obiect) organizate sub formă de arbori binari ce posedă multe operaţii specifice mulţimilor dinamice (CAUTĂ, MINIM, MAXIM, PREDECESOR, SUCCESOR, lnserează şi ŞTERGE). Operaţiile de bază pe arborii binari consumă un timp proporţional cu înălţimea arborelui. Pentru un arbore binar complet cu n noduri, aceste operaţii se execută în cazul cel mai defavorabil întrun timp O(lgn). Înălţimea unui arbore binar de căutare construit aleator este O(lgn). Ce este un arbore binar de căutare? Fiecare obiect (nod al arborelui binar de căutare) conţine câmpurile: cheie şi date adiţionale. Subarbore stâng, subarbore drept şi părinte care referă spre nodurile corespunzătoare fiului stâng, fiului drept şi respectiv părintelui nodului. Dacă un fiu sau un părinte lipseşte, câmpul corespunzător acestuia va conţine valoarea NIL. Nodul rădăcină este singurul nod din arbore care are valoarea NIL pentru câmpul părinte p. Cheile sunt întotdeauna astfel memorate încât ele satisfac proprietatea arborelui binar de căutare: cheia oricărui nod din subarborele stâng este mai mică sau egală decât cheia din rădăcină care este la rândul ei mai mică sau egală decât cheia oricărui nod din subarborele drept. Proprietatea arborelui binar de căutare permite tipărirea tuturor cheilor în ordine crescătoare folosind un algoritm recursiv simplu (traversarea arborelui în in-ordine - cheia rădăcinii unui arbore se tipăreşte între valorile din subarborele său stâng şi cele din subarborele său drept). Există alte două tipuri de parcurgeri ale arborilor binari de căutare: pre-ordine şi post-ordine. ARBORE-TRAVERSARE-INORDINE(x) 1: dacă x NIL atunci 2: ARBORE-TRAVERSARE-INORDINE(stânga[x]) 3: afişează cheie[x] 4: ARBORE-TRAVERSARE-INORDINE(dreapta[x]) Căutare recursivă - în arbore binar de căutare Folosită la căutarea unui nod având cheia cunoscută, intr-un arbore binar de căutare. Se cunosşte pointerul x la rădăcina arborelui şi valoarea k a cheii căutate. ARBORE-CAUTĂ returneazâ un pointer la nodul având cheia k dacă există un astfel de nod în arbore sau NIL în caz contrar. ARBORE-CAUTĂ(x, k) 1: dacă x = NIL sau k = cheie[x] atunci 2: returnează x 3: dacă k < cheie[x] atunci 4: returnează ARBORE-CAUTĂ(stânga[x], k) 5: altfel

6: returnează ARBORE-CAUTĂ(dreapta[x], k) Căutare iterativă - în arbore binar de căutare ARBORE-CAUTĂ-ITERATIV(x, k) 1: cât timp x NIL şi k cheie[x] execută 2: dacă k < cheie[x] atunci 3: x stânga[x] 4: altfel 5: x dreapta[x] 6: returnează x Minimul şi maximul Determinarea elementului având cheia minimă dintr-un arbore binar de căutare se realizează întotdeauna urmând pointerii fiu stânga începând cu rădăcina şi terminând când se întâlneşte NIL. Pentru determinarea elementului de cheie maximă se procedează simetric. ARBORE-MINIM(x) 1: cât timp stânga[x] NIL execută 2: x stânga[x] 3: returnează x ARBORE-MAXIM(x) 1: cât timp dreapta[x] NIL execută 2: x dreapta[x] 3: returnează x Succesorul şi predecesorul unui nod Cunoscând un nod dintr-un arbore binar de căutare, este importantă uneori determinarea succesorului său în ordinea de sortare determinată de traversarea în inordine a arborelui (în cazul ştergerii din arbore a unui nod având ambii fii, pentru realizarea legăturilor). Dacă toate cheile sunt distincte, succesorul nodului x este nodul având cea mai mică cheie mai mare decât cheie[x]. Structura de arbore binar de căutare permite determinarea succesorului unui nod chiar şi fără compararea cheilor. ARBORE-SUCCESOR tratează două alternative: dacă subarborele drept al nodului x nu este vid, atunci succesorul lui x este chiar cel mai din stânga nod din acest subarbore drept. În celălalt caz, când subarborele drept al nodului x este vid şi x are un succesor y, atunci y este cel mai de jos strămoş al lui x al cărui fiu din stânga este de asemenea strămoş al lui x. ARBORE-SUCCESOR(x) 1: dacă dreapta[x] NIL atunci 2: returnează ARBORE-MINIM(dreapta[x]) 3: y p[x] 4: cât timp y NIL şi x = dreapta[y] execută 5: x y 6: y p[y] 7: returnează y

Teorema: Pe un arbore binar de căutare de înălţime h, operaţiile pe mulţimi dinamice CAUTĂ, MINIM, MAXIM, SUCCESOR şi PREDECESOR se pot executa într-un timp O(h). Inserarea şi ştergerea Provoacă modificarea mulţimii dinamice reprezentată de arborele binar de căutare. Structura de date trebuie modificată în sensul că ea trebuie pe de o parte să reflecte inserarea sau ştergerea, iar pe de altă parte să conserve proprietatea arborelui binar de căutare. Inserarea unui element nou - relativ simplă, pe când gestiunea ştergerii unui element este mai complicată. Inserarea ARBORE-INSEREAZĂ primeşte ca parametrii arborele binar de căutare T şi nodul z pentru care cheie[z] = v (valoarea de inserat), stânga[z] = NIL şi dreapta[z] = NIL. ARBORE-INSEREAZĂ(T, z) 1: y NIL 2: x rădăcină[t] 3: cât timp x NIL execută 4: y x 5: dacă cheie[z] < cheie[x] atunci 6: x stânga[x] 7: altfel 8: x dreapta[x] 9: p[z] y 10: dacă y = NIL atunci 11: rădăcină[t] z t2: altfel dacă cheie[z] < cheie[y] atunci 13: stânga[y] z 14: altfel 15: dreapta[y] z Ştergerea ARBORE-ŞTERGE primeşte ca argument un pointer la z (nodul care va fi şters). Distingem trei situaţii: Dacă z nu are fii, se va modifica părintele său p[z] pentru a-i înlocui fiul z cu NIL. Dacă nodul are un singur fiu, z va fi eliminat din arbore prin inserarea unei legături de la părintele lui z la fiul lui z. Dacă nodul are doi fii, se va elimina din arbore succesorul y al lui z, care nu are fiu stâng şi apoi se vor înlocui cheia şi datele adiţionale ale lui z cu cheia şi datele adiţionale ale lui y. ARBORE-ŞTERGE(T, z) 1: dacă stânga[z] = NIL sau dreapta[z] = NIL atunci 2: y z 3: altfel 4: y ARBORE-SUCCESOR(z) 5: dacă stânga[y] NIL atunci

6: x stânga[y] 7: altfel 8: x dreapta[y] 9: dacă x NIL atunci 10: p[x] p[y] 11: dacă p[y] = NIL atunci 12: rădăcină[t] x 13: altfel dacă y =stânga[p[y]] atunci 14: stânga[p[y]] x 15: altfel 16: dreapta[p[y]] x 17: dacă y z atunci 18: cheie[z] cheie[y] se copiază şi datele adiţionale ale lui y 19: returnează y II. APLICAŢII II.1. Scrieţi un program care foloseşte o abordare recursivă şi alocare dinamică pentru descrierea operaţiilor aferente arborilor binari. a) Creare arbore. b) Calcularea numărului de noduri (chei din arbore). c) Ştergerea întregului arbore. d) Căutarea unui element în arbore. e) Parcurgerea arborelui în preordine (SDR), inordine (SRD), postordine (RSD) f) Determinarea elementului minim şi maxim din arbore. g) Suma elementelor pare din arbore. h) Afişarea tuturor numerelor prime din arbore. i) Listarea nodurilor aflate pe un anumit nivel în arbore. j) Determinarea adâncimii maxime a unui arbore binar (adică al numărului de nivel maxim asociat nodurilor terminale) şi a elementelor de pe calea respectivă. k) Verificarea dacă un arbore primit ca parametru reprezintă un arbore binar de căutare (S<R<D). II.2. Scrieţi un program care implementează operaţiile aferente arborilor binari de căutare (CAUTĂ, MINIM, MAXIM, PREDECESOR, SUCCESOR, lnserează şi ŞTERGE) folosind funcţiile descrise în prezentul document. II.3. Scrieţi un program care pornind de la un graf neorientat determină dacă este arbore. Abordare cu STL (şablonul queue <int>q;). Se citeşte dintr-un fişier pe câte o linie separat numărul de noduri şi perechile de noduri între care exista o muchie. Practic se verifică întâi dacă numărul de noduri este cu unul mai mult decât numărul de muchii (condiţie necesară dar nu şi suficientă). Dacă numărul de muchii este mai mare sau egal decât numărul de muchii înseamnă că sigur există un ciclu în graf, motiv pentru care graful nu este arbore. Condiţia de suficienţă este realizată dacă graful este conex. Acest lucru se verifică prin parcurgerea grafului în lăţime: se introduce într-o coadă primul nod şi de la acesta se parcurg muchiile incidente cu alte noduri. Nodurile adiacente (vizitate) se introduc în coadă pentru a fi parcurse muchiile incidente acestora altele decât cele anterior parcurse. După analiza unui nod (verificarea adiacenţei cu toate celelalte noduri) acesta se

scoate din coadă. Dacă se goleşte coada se verifică dacă au fost vizitate toate nodurile caz în care graful este conex, şi ajungând în acest punct (nu conţine cicluri) el este arbore. Se consideră structura de date şi prototipurile următoarelor funcţii: struct nod{ int inf; struct nod *st,*dr; }*cap,*p; struct nod *creare(void); crearea recursivă a arborelui: întâi informația curentă, apoi crearea subarborelui stâng şi în final a celui drept. struct nod *creare(void){ struct nod *p; printf("\nintroduceti informatia: "); p=(struct nod*)malloc(sizeof(struct nod)); scanf("%d",&p >inf); p >st=p >dr=null; printf("\n\ndoriti introducerea subarborelui stang(d/n)? "); if(getche()!='n')p >st=creare(); puts("\n\ndoriti introducerea subarborelui drept(d/n)? "); if(getche()!='n')p >dr=creare(); return(p); } void parcurgere_preord(struct nod *p); parcurgerea în preordine a arborelui: întâi se afişează / analizează rădăcina, apoi subarborele stâng apoi cel drept. void parcurgere_inordine(struct nod *p); parcurgerea în ordine a arborelui: întâi se afişează / analizează subarborele stâng, apoi rădăcina şi în final subarborele drept. void parcurgere_postordine(struct nod *p); parcurgerea în postordine a arborelui: întâi se afişează / analizează subarborele stâng, apoi cel drept şi în final rădăcina. int numar_elemente(struct nod *p); numărul de elemente al unui arbore este egal cu 1 + numărul de elemente al subarborelui stâng + numărul de elemente al subarborelui drept. void citestema(int[100][100],int &); citirea din fişier a listei de muchii şi transformarea în matrice de adiacență şi obținerea numărului de noduri al grafului.

De asemenea, este necesară o variabilă ajutătoare declarată global: int vizitat[100]; care reţine informaţii despre vizitarea sau nu a unui nod din graf, precum şi coada în care se introduc nodurile queue<int>q;. BIBLIOGRAFIE [Iva98] Ivaşc C., Prună M. Bazele informaticii (Grafuri şi elemente de combinatorică), Manual pentru clasa a X-a, Editura Petrion, 1998. [Cor90] Cormen, T. H., Leiserson, C. E., Rivest, R. L. Introduction to Algorithms. McGraw- Hill, New York, 1990.