12. ARBORI BINARI ŞI ARBORI DE CĂUTARE

Σχετικά έγγραφα
Metode iterative pentru probleme neliniare - contractii

Curs 10 Funcţii reale de mai multe variabile reale. Limite şi continuitate.

DISTANŢA DINTRE DOUĂ DREPTE NECOPLANARE

(a) se numeşte derivata parţială a funcţiei f în raport cu variabila x i în punctul a.

5. FUNCŢII IMPLICITE. EXTREME CONDIŢIONATE.

Laborator 11. Mulţimi Julia. Temă

Analiza în curent continuu a schemelor electronice Eugenie Posdărăscu - DCE SEM 1 electronica.geniu.ro

Functii definitie, proprietati, grafic, functii elementare A. Definitii, proprietatile functiilor X) functia f 1

Functii definitie, proprietati, grafic, functii elementare A. Definitii, proprietatile functiilor

III. Serii absolut convergente. Serii semiconvergente. ii) semiconvergentă dacă este convergentă iar seria modulelor divergentă.

V.7. Condiţii necesare de optimalitate cazul funcţiilor diferenţiabile

prin egalizarea histogramei

Curs 14 Funcţii implicite. Facultatea de Hidrotehnică Universitatea Tehnică "Gh. Asachi"

Planul determinat de normală şi un punct Ecuaţia generală Plane paralele Unghi diedru Planul determinat de 3 puncte necoliniare

Curs 1 Şiruri de numere reale

Metode de interpolare bazate pe diferenţe divizate

Esalonul Redus pe Linii (ERL). Subspatii.

MARCAREA REZISTOARELOR

SEMINAR 14. Funcţii de mai multe variabile (continuare) ( = 1 z(x,y) x = 0. x = f. x + f. y = f. = x. = 1 y. y = x ( y = = 0

riptografie şi Securitate

Laborator 1: INTRODUCERE ÎN ALGORITMI. Întocmit de: Claudia Pârloagă. Îndrumător: Asist. Drd. Gabriel Danciu

a n (ζ z 0 ) n. n=1 se numeste partea principala iar seria a n (z z 0 ) n se numeste partea

Criptosisteme cu cheie publică III

Seminariile Capitolul X. Integrale Curbilinii: Serii Laurent şi Teorema Reziduurilor

Subiecte Clasa a VII-a

a. 11 % b. 12 % c. 13 % d. 14 %

Integrala nedefinită (primitive)

R R, f ( x) = x 7x+ 6. Determinați distanța dintre punctele de. B=, unde x și y sunt numere reale.

III. Reprezentarea informaţiei în sistemele de calcul

COLEGIUL NATIONAL CONSTANTIN CARABELLA TARGOVISTE. CONCURSUL JUDETEAN DE MATEMATICA CEZAR IVANESCU Editia a VI-a 26 februarie 2005.

Subiecte Clasa a VIII-a

Aplicaţii ale principiului I al termodinamicii la gazul ideal

Curs 4 Serii de numere reale

Sisteme diferenţiale liniare de ordinul 1

SERII NUMERICE. Definiţia 3.1. Fie (a n ) n n0 (n 0 IN) un şir de numere reale şi (s n ) n n0

5.4. MULTIPLEXOARE A 0 A 1 A 2

5.5. REZOLVAREA CIRCUITELOR CU TRANZISTOARE BIPOLARE

Asupra unei inegalităţi date la barajul OBMJ 2006

Problema a II - a (10 puncte) Diferite circuite electrice

Capitolul 14. Asamblari prin pene

Seminar 5 Analiza stabilității sistemelor liniare

Fig Impedanţa condensatoarelor electrolitice SMD cu Al cu electrolit semiuscat în funcţie de frecvenţă [36].

Examen AG. Student:... Grupa:... ianuarie 2011

Capitolul 4 PROPRIETĂŢI TOPOLOGICE ŞI DE NUMĂRARE ALE LUI R. 4.1 Proprietăţi topologice ale lui R Puncte de acumulare

Concurs MATE-INFO UBB, 1 aprilie 2017 Proba scrisă la MATEMATICĂ

RĂSPUNS Modulul de rezistenţă este o caracteristică geometrică a secţiunii transversale, scrisă faţă de una dintre axele de inerţie principale:,

Examen AG. Student:... Grupa: ianuarie 2016

Movile Binomiale (Heap-uri binomiale)

Curs 2 Şiruri de numere reale

Conice. Lect. dr. Constantin-Cosmin Todea. U.T. Cluj-Napoca


Componente şi Circuite Electronice Pasive. Laborator 3. Divizorul de tensiune. Divizorul de curent

Universitatea din Bucureşti Facultatea de Matematică şi Informatică. Algebră (1)

13. Grinzi cu zăbrele Metoda izolării nodurilor...1 Cuprins...1 Introducere Aspecte teoretice Aplicaţii rezolvate...


Zgomotul se poate suprapune informaţiei utile în două moduri: g(x, y) = f(x, y) n(x, y) (6.2)

VII.2. PROBLEME REZOLVATE

Definiţia generală Cazul 1. Elipsa şi hiperbola Cercul Cazul 2. Parabola Reprezentari parametrice ale conicelor Tangente la conice

Lectia VI Structura de spatiu an E 3. Dreapta si planul ca subspatii ane

2. Sisteme de forţe concurente...1 Cuprins...1 Introducere Aspecte teoretice Aplicaţii rezolvate...3

Orice izometrie f : (X, d 1 ) (Y, d 2 ) este un homeomorfism. (Y = f(x)).

TEMA 9: FUNCȚII DE MAI MULTE VARIABILE. Obiective:

3. Momentul forţei în raport cu un punct...1 Cuprins...1 Introducere Aspecte teoretice Aplicaţii rezolvate...4

BARAJ DE JUNIORI,,Euclid Cipru, 28 mai 2012 (barajul 3)

Principiul Inductiei Matematice.

Principiul incluziunii si excluziunii. Generarea şi ordonarea permutărilor. Principiul porumbeilor. Pri

V O. = v I v stabilizator

Exemple de probleme rezolvate pentru cursurile DEEA Tranzistoare bipolare cu joncţiuni

1.7. AMPLIFICATOARE DE PUTERE ÎN CLASA A ŞI AB

T R A I A N ( ) Trigonometrie. \ kπ; k. este periodică (perioada principală T * =π ), impară, nemărginită.

Proiectarea Algoritmilor 4. Scheme de algoritmi Programare dinamica

Metode Runge-Kutta. 18 ianuarie Probleme scalare, pas constant. Dorim să aproximăm soluţia problemei Cauchy

Cursul 11. Cuplaje. Sisteme de reprezentanti distincţi. Arbori de acoperire. Enumerarea tuturor arborilor cu număr fixat de noduri.

Cursul Măsuri reale. D.Rusu, Teoria măsurii şi integrala Lebesgue 15

Subiecte Clasa a V-a

TABELE DE DISPERSIE I. CONSIDERAŢII TEORETICE

8 Intervale de încredere

Progresii aritmetice si geometrice. Progresia aritmetica.

Functii Breviar teoretic 8 ianuarie ianuarie 2011

Capitolul 4. Integrale improprii Integrale cu limite de integrare infinite

LUCRAREA NR. 1 STUDIUL SURSELOR DE CURENT

SEMINARUL 3. Cap. II Serii de numere reale. asociat seriei. (3n 5)(3n 2) + 1. (3n 2)(3n+1) (3n 2) (3n + 1) = a

Proiectarea filtrelor prin metoda pierderilor de inserţie

4. Măsurarea tensiunilor şi a curenţilor electrici. Voltmetre electronice analogice

7 Distribuţia normală

2 Transformări liniare între spaţii finit dimensionale

ANEXA 4. OPERAŢII ARITMETICE IMPLEMENTĂRI

Aparate de măsurat. Măsurări electronice Rezumatul cursului 2. MEE - prof. dr. ing. Ioan D. Oltean 1

2.1 Sfera. (EGS) ecuaţie care poartă denumirea de ecuaţia generală asferei. (EGS) reprezintă osferă cu centrul în punctul. 2 + p 2

5.1. Noţiuni introductive

Ecuatii exponentiale. Ecuatia ce contine variabila necunoscuta la exponentul puterii se numeste ecuatie exponentiala. a x = b, (1)

Lucrare. Varianta aprilie I 1 Definiţi noţiunile de număr prim şi număr ireductibil. Soluţie. Vezi Curs 6 Definiţiile 1 şi 2. sau p b.

a. 0,1; 0,1; 0,1; b. 1, ; 5, ; 8, ; c. 4,87; 6,15; 8,04; d. 7; 7; 7; e. 9,74; 12,30;1 6,08.

Sortare. 29 martie Utilizarea şi programarea calculatoarelor. Curs 16

B={0,1,...,MAX-1} : K

Lucrul mecanic. Puterea mecanică.

Tablouri unidimensionale

TAD Stiva (STACK) Observaţii: 1. sunt aşezate ordonat unele peste altele. Un element nou se adaugă în stivă deasupra elementului cel mai recent

Capitolul 2 - HIDROCARBURI 2.5.ARENE

Ecuaţia generală Probleme de tangenţă Sfera prin 4 puncte necoplanare. Elipsoidul Hiperboloizi Paraboloizi Conul Cilindrul. 1 Sfera.

Transcript:

12. ARBORI BINARI ŞI ARBORI DE CĂUTARE 12.1 Structura de date de tip arborescent Construirea unei structurii de date de tip arborescent porneşte de la problema pe care o avem de rezolvat. Pentru găsirea soluţiei ecuaţiei f ( x ) 0 pentru x [ a, b ] se efectuează cu metode de calcul numeric, dintre care cea mai simplă este aceea a înumătăţirii intervalului. Se calculează: Dacă: c ( a b ) / 2 (12.1) f ( a ) *f ( c ) 0 (12.2) înseamnă că rădăcina x [ a, c ), în caz contrar x (c, b ]. Noul subinterval este şi el divizat. Astfel, avem imaginea unei modalităţi de lucru ierarhizată pe atâtea niveluri câte sunt necesare obţinerii unei precizii pentru soluţia ecuaţiei f ( x ) 0. Se asociază acestor niveluri reprezentarea grafică din figura 12.1. [ a, b ] a + b [a, ] 2 ( a + b, b ] 2 3a + b [a, ] 4 3a + b a + b (, ] 4 2 a + b a + 3b (, ] 2 4 a + 3b (, b ] 4 Figura 12.1 Reprezentarea grafică asociată divizării intervalelor Pentru evaluarea expresiei aritmetice: ( a b c d) ( x y) e c d (12.3) prin modul de efectuare a calculelor conduce la reprezentarea din figura 12.2.

* / e * + c d + + x y a b c d Figura 12.2 Reprezentarea arborescentă asociată evaluării expresiei Pentru regăsirea cărţilor într-o bibliotecă, în fişierul tematic cotele se structurează pe nivele, ca în exemplul din figura 12.3. biblioteca 1xxxxx : 7xxxxx matematica 1xxxxx : 23xxxx calculatoare 24xxxx : 51xxxx economie 52xxxx : 7xxxxx algebra geometrie 1xxxxx / 198xxx / 197xxx 23xxxx hardware software 24xxxx / 420xxx / 419xxx 51xxxx teorie software 52xxxx / 681xxx / 680xxx 7xxxxx Figura 12.3 Structura asociată fişierului de cote ale cărţilor Reprezentarea în memorie a informaţiilor care au multiple legături între ele, trebuie să fie astfel făcută, încât să poată realiza parcurgerea completă a zonelor sau localizarea unui element din structură. Se observă că în arborescenţă există un nod numit rădăcină sau părinte. Acesta are descendenţi. Fiecare descendent poate fi la rândul său părinte şi în acest caz are descendenţi. Arborele binar este caracterizat prin aceea că, orice nod al său are un singur părinte şi maxim doi descendenţi. Fiecare nod este reprezentat prin trei informaţii şi anume: Z informaţia utilă care face obiectul prelucrării, ea descriind elementul sau fenomenul asociat nodului; informaţia care localizează nodul părinte; informaţia (informaţiile) care localizează nodul (nodurile) descendent (descendente).

Alocarea dinamică determină ca şi să fie variabile aleatoare, ale căror legi de repartiţie sunt necunoscute. Valorile lor sunt stocate în zona de memorie, formând împreună cu variabila Z structura de date asociată unui nod, structură ce corespunde tripletului (Z,, ) asociat nodului dintr-un graf de formă arborescentă binară. Volumul informaţiilor destinate localizării nodurilor, depinde de obiectivele urmărite şi de rapiditatea cu care se doreşte localizarea unui anumit nod. Cu cât diversitatea prelucrărilor este mai mare, cu atât se impune stocarea mai multor informaţii de localizare. Z -1-1 -1 Z Z + 1 +1-1 adr (Z adr (Z -1 1 ) ) Figura 12.4 Modelul grafic asociat tripletului (Z,, ) Dacă tripletul (Z,, ) ce corespunde modelului grafic din figura 12.4 permite baleierea de sus în os, sau de os în sus, pe o ramură a arborelui. Pentru a parcurge pe orizontală arborele, este necesară atât o informaţie suplimentară de localizare, care corespunde nodului vecin din dreapta de pe acelaşi nivel, cât şi informaţia pentru localizarea nodului din stânga de pe acelaşi nivel. Un astfel de arbore se descrie prin: ( Z,,,, ) (12.4) Descrierea completă a unui arbore, presupune crearea mulţimii tripletelor sau cvintuplelor asociate nodurilor. De exemplu, arborescenţei asociate evaluării expresiei: e = a + b + c; (12.5) prezentate în figura 12.5 îi corespunde alocarea şi iniţializarea zonelor de memorie din figura 12.6. = c + + e a Figura 12.5 Structura arborescentă asociată evaluării expresiei e b

= null + e null c null + a null b null Figura 12.6 Alocarea şi iniţializarea zonelor de memorie pentru implementarea structurii arborescente Acestor reprezentări grafice, trebuie să le corespundă algoritmi pentru încărcarea adreselor, întrucât a construi forma liniarizată a structurii arborescente, înseamnă în primul rând, a aloca zone de memorie şi în al doilea rând, a iniţializa membrii structurii cu adrese care să permită reconstruirea corectă a înlănţuirii. Se observă că pentru iniţializarea corectă, este necesară existenţa la un moment dat a pointerilor spre trei zone de memorie alocate dinamic şi anume: pp pointerul spre zona alocată nodului precedent (părinte); pc pointerul spre zona asociată nodului curent; pd pointerul spre zona asociată primului descendent; Construirea nodului ( Z,, ) revine la efectuarea iniţializărilor: ref (pc). Z ref (pc). ref (pc). pp pc; pc pd; new (pd); valoare_citita; pp; pd; (12.6) După efectuare secvenţei se face trecerea la pasul următor. Folosind simbolurile, orice structură arborescentă se reprezintă prin: N mulţimea nodurilor A mulţimea arcelor De exemplu, arborescenţa dată pentru calculul expresiei 12.5 se reprezintă prin: şi N = e, =, a, +, b, +, c (12.7)

A = (a+), (b+), (c+), (+, =), (=, e) (12.8) Se observă că pentru fiecare element al mulţimii N, se alocă dinamic zona de memorie care conţine şi informaţiile,. La alocare este posibilă numai iniţializarea zonei Z. Odată cu alocarea se iniţializează şi un vector de pointeri, cu adresele corespunzătoare zonelor de memorie puse în corespondenţă cu nodurile. În continuare, preluând elementele mulţimii A, are loc completarea câmpurilor şi. De exemplu, pentru arborele binar din figura 12.7 construirea se efectuează prin alocarea a 7 zone de memorie cu structura ( Z,, ) pentru nodul din mulţimea N A, B, C, D, E, F, G şi se iniţializează vectorul de pointeri pp[i] după cum urmează: pp[1] pp[2] pp[3] pp[4] pp[5] pp[6] pp[7] adr (ZA) adr (ZB) adr (ZC) adr (ZD) adr (ZE) adr (ZF) adr (ZG) (12.9) Baleierea mulţimii: A (AB), (AC), (BD), (BE), (CF), (CG) (12.10) revine la efectuarea atribuirilor: ref (pp[1] ). pp[2] ref (pp[2]). pp[4] ref (pp[3] ). pp[6] ref (pp[4]). ref (pp[5]). ref (pp[6]). ref (pp[7]). NULL (12.11) ref (pp[2] ). pp[1] ref (pp[4] ). pp[2] ref (pp[3]). pp[1] ref (pp[6] ). pp[3] ref (pp[7] ). pp[3] ref (pp[1]). ref (pp[1]). NULL

A B C D E F G Figura 12.7 Arbore binar Pentru arborii binari echilibraţi, există posibilitatea ca după alocarea memoriei să se descrie elementele mulţimii A, după care iniţializările câmpurilor θ şi γ să se facă prin apelarea unei funcţii. Problematica devine mai simplă, dacă arborele binar este complet, adică are n niveluri la bază 2 (n-1) elemente descendente, fără a fi părinte, noduri terminale. În programele C/C++, pentru implementarea structurilor de date necontigue, arborele binar se defineşte prin următorul tip de bază derivat. struct arbore int valoare; arbore *precedent; arbore *urmator; ; class arb arbore *rad; ; struct arbore_oarecare int valoare; arbore_oarecare **fii; //lista fiilor unui nod int nrfii; //nr de fii ai nodului ; class arb_oarecare arbore_oarecare *rad; ; struct arbore_binar int valoare; arbore_binar *stanga; arbore_binar *dreapta; ; class arb_binar arbore_binar *rad; ;

12.2 Transformarea arborilor oarecare în arbori binari Aplicaţiile concrete, asociază unor obiecte, subansamble sau procese, structuri de tip arborescent care nu sunt binare, astfel încât se conturează ideea ca arborii binar sunt cazuri particulare de arbori, mai ales prin frecvenţa cu care sunt identificaţi în practică. Mecanismele de realizare şi de utilizare a arborilor binar îi fac practice, deşi în realitate au frecvenţa de apariţie scăzută. Apare problema transformării unei structuri arborescente oarecare într-o structură arborescentă binară, problema rezolvabilă prin introducerea de noduri fictive. Astfel, fiind dată arborescenţa din figura 12.8, transformarea ei în structură arborescentă binară, revine la introducerea nodurilor fictive, x, y, u, v, w, rezultând arborele din figura 12.9. A B C D e f g h i k i Figura 12.8 Structură arborescentă oarecare A B x e u C D f g h y i v w k l Figura 12.9 Structură arborescentă cu noduri fictive

Arborele oarecare, are un număr de noduri mai mic decât arborele binar, nodurilor fictive corespunzându-le zone de memorie structurate (NULL, γ, θ). Alocarea dinamică presupune, ca în zona [D i, D f ] prin dealocare să apară goluri, adică zone libere ce sunt realocate altor variabile. Este necesară o gestionare a acestor zone şi periodic trebuie să se efectueze o realocare prin reorganizare, aşa fel încât să dispară golurile rezultate în procesul de alocare-dealocare multiplă. De exemplu, pentru un program P, este necesară alocarea a 3 zone de memorie de 1500, 2000, 4000 baiţi, ce corespund arborilor binar A, B şi C. Alocarea este efectuată iniţializând variabilele pointer p A, p B şi p C prin apelul succesiv al funcţiei alocare( ), (pas 1). Dealocarea după un timp a arborelui binar B, determină apariţia unui gol între zonele ocupate de variabilele A şi C, (pas 2). Alocarea unei zone de memorie pentru arborii binari D (3000 baiţi) şi E (1000 baiţi), revin la a dispune pe D în continuarea lui C şi a intercala arborele E între A şi C, în golul rezultat din dealocarea lui E, rămânând între E şi C un gol de 300 baiţi, (pas 3). Dacă se păstrează informaţiile privind modul de iniţializare a variabilelor pointer care stochează adresele nodurilor rădăcină a arborilor A, E, C şi D, este posibilă glisarea informaţiilor în aşa fel încât să dispară golul dintre E şi C. Nu s-a luat în considerare însăşi necontiguitatea din interiorul fiecărui arbore. În practică, apare problema optimizării dispunerii variabilelor dinamice, dar şi cea a alegerii momentului în care dispersia elementelor atinge un astfel de nivel, încât zona pentru alocare dinamică este practic inutilizabilă şi trebuie reorganizată. 12.3 Arbori binari de căutare Un arbore binar de căutare este un arbore binar care are proprietatea că prin parcurgerea în inordine a nodurilor se obţine o secvenţă monoton crescătoare a cheilor (cheia este un câmp ce serveşte la identificarea nodurilor în cadrul arborelui). Câmpul cheie este singurul care prezintă interes din punct de vedere al operaţiilor care se pot efectua asupra arborilor de căutare. Principala utilizare a arborilor binari de căutare este regăsirea rapidă a unor informaţii memorate în cheile nodurilor. Pentru orice nod al unui arbore de căutare, cheia acestuia are o valoare mai mare decât cheile tuturor nodurilor din subarborele stâng şi mai mică decât cheile nodurilor ce compun subarborele drept.

20 10 25 7 22 26 Figura 12.10 Arbore binar de căutare Structura de date folosită pentru descrierea unui nod al unui arbore binar de căutare va fi următoarea: struct arbore_binar int cheie; arbore_binar *stanga; arbore_binar *dreapta; ; class arb_binar arbore_binar *rad; ; Rădăcina arborelui binar de căutare va fi definită în felul următor: arb *Radacina = NULL; (12.12) Se observă ca fiecare nod este compus din cheia asociată şi din informaţiile de legătură care se referă eventualii fii. Aşa cum le spune şi numele, arborii binari de căutare sunt folosiţi pentru regăsirea rapidă a informaţiilor memorate în cheile nodurilor. De aceea căutarea unui nod cu o anumită valoarea a cheii este o operaţie deosebit de importantă. Căutarea începe cu nodul rădăcină al arborelui prin compararea valorii cheii căutate cu valoarea cheii nodului curent. Dacă cele două valori coincide, căutarea s-a încheiat cu succes. Dacă informaţia căutată este mai mică decât cheia nodului, căutarea se continuă în subarborele stâng. Dacă cheia căutată este mai mare decât valoarea cheii nodului, căutarea se reia pentru subarborele drept. Crearea unui arbore binar de căutare presupune adăugarea câte unui nod la un arbore iniţial vid. După inserarea unui nod, arborele trebuie să rămână în continuare ordonat. Din acest motiv, pentru adăugarea unui nod se parcurge arborele începând cu rădăcina şi continuând cu subarborele stâng sau drept în funcţie de relaţia de ordine dintre cheia nodului şi cheia de inserat. Astfel, dacă cheia de inserat este mai mica decât cheia nodului, următorul nod vizitat va fi rădăcina subarborelui stâng. În mod similar, dacă cheia de inserat este mai mare decât cheia nodului, traversarea se va continua cu nodul rădăcină al subarborelui drept. Această modalitate de traversare se continuă până în momentul în care se aunge la un nod fără

descendent. Acestui nod îi va fi adăugat un nod fiu cu valoarea dorită a cheii. Aplicaţiile care utilizează arbori binari de căutare pot permite sau pot interzice, în funcţie de filozofia proprie, inserarea în cadrul arborelui a unei chei care există dea. Inserarea în cadrul arborelui anterior a unui nou nod cu valoarea cheii egală cu 12 conduce către următorul arbore, figura 12.11. 20 10 25 7 12 22 26 Figura 12.11 Arbore binar de căutare după inserarea unui nod Maniera uzuală de inserare a unui nod într-un arbore binar de căutare este cea recursivă. În practică, de cele mai multe ori căutarea şi inserarea se folosesc împreună. Astfel, în cazul în care căutarea unei chei s-a efectuat fără succes, aceasta este adăugată la arborele binar de căutare. O altă operaţie care se poate efectua asupra unui arbore binar de căutare este ştergerea unui nod care are o anumită valoare a cheii. Dacă valoarea cheii este găsită în cadrul arborelui, nodul corespunzător este şters. Arborele trebuie să rămân arbore de căutare şi după ştergerea nodului. În ceea ce priveşte nodul care va fi şters, acesta se va încadra întruna din variantele următoare: a) nodul nu are subarbori (fii); b) nodul are doar subarbore stâng; c) nodul are doar subarbore drept; d) nodul are atât subarbore stâng cât şi subarbore drept. În cazul în care nodul nu are nici subarbore stâng dar nici subarbore drept (varianta a) este necesară doar ştergerea nodului. Nu sunt necesare alte operaţiuni de actualizare a arborelui. Figura 12.12 Arbore binar de căutare înainte de ştergerea unui nod

În figura 12.12 este prezentat un fragment al unui arbore binar de căutare din care dorim să ştergem nodul din dreapta, iar în figura 12.13 se prezintă acelaşi fragment de arbore dar după ştergerea nodului dorit. Figura 12.13 Arbore binar de căutare după ştergerea unui nod Pentru cazurile b şi c (nodul pe e dorim să-l ştergem are subarbore stâng sau drept), pe lângă ştergerea nodului este necesară şi actualizarea legăturilor dintre nodurile arborelui. În figurile 12.14 şi 12.16 se prezintă câte un fragment dintr-un arbore binar de căutare din care dorim să ştergem nodul evidenţiat. În figura 12.14, nodul pe care dorim să-l ştergem are numai subarbore stâng iar cel din figura 12.16 are doar subarbore drept. În figurile 12.15 şi 12.17 se pot observa efectele operaţiei de ştergere. Figura 12.14 Subarbore numai cu descendent stâng Figura 12.15 Subarbore după efectuarea ştergerii

Figura 12.16 Subarbore numai cu descendent drept Figura 12.17 Subarbore după efectuarea ştergerii Pentru aceste prime trei cazuri, actualizarea arborelui se face în felul următor: fiul nodului care va fi şters, dacă există, va deveni fiul tatălui acestuia. Actualizarea arborelui este urmată de ştergerea nodului din memorie. Cazul în care nodul ce se doreşte a fi şters are atât subarbore stâng cât şi subarbore drept necesită o tratare specială. Astfel, mai întâi se localizează fie cel mai din stânga fiu al subarborelui drept fie cel mai din dreapta fiu al subarborelui drept. Cheile acestor noduri sunt valoarea imediat următoare cheii nodului ce se doreşte a fi şters şi valoarea precedentă. După suprimarea nodului dorit, arborele va trebui să rămână în continuare arbore de căutare ceea ce înseamnă că relaţia de ordine dintre nodurile arborelui va trebui să se păstreze. Pentru aceasta, unul din nodurile prezentate anterior va trebui adus în locul nodului care se doreşte a fi şters după care are loc ştergerea efectivă a nodului dorit. Determinarea celui mai din dreapta fiu al subarborelui stâng se face parcurgând subarborelui stâng prin vizitarea numai a fiilor din dreapta. Primul nod care nu are subarbore drept este considerat ca fiind cel mai din dreapta nod al subarborelui stâng. În figura 12.18 se prezintă un fragment de arbore binar de căutare din care dorim să suprimăm nodul evidenţiat care are doi descendenţi. Presupunem ca nodul haşurat este cel mai din dreapta fiu al subarborelui stâng. Acest nod va lua locul nodului care se va şterge. În figura 12.19 este reprezentat fragmentul de arbore după efectuarea operaţiei de ştergere a nodului dorit.

Figura 12.18 Subarbore cu doi descendenţi Figura 12.19 Subarbore după efectuarea ştergerii 12.4 Aplicaţii care utilizează structura de date de tip arbore binar de căutare Asupra arborilor binari de căutare pot fi efectuate o serie de operaţii, dintre care o parte sunt specifice tuturor structurilor de date compuse (adăugare element, ştergere elemente) iar altele sunt specifice acestui tip de structură de date. De asemenea se remarcă operaţii la nivel de element (nod), precum şi operaţii care implică întregul arbore. Programul următor, exemplifică o modalitate de creare a unui arbore binar de căutare, stergere noduri, traversare, numarare noduri şi de tipărire a acestuia: #include <iostream.h> #include <conio.h> #include <stdio.h> #include <malloc.h> #include <string.h>

struct nod ; int info; nod *stg,*drt; class arbbin nod *rad; int stergere(nod *&); void stergere_nod(nod*&,int); public: arbbin() rad=null;; ~arbbin() rad=null;; void traversare_srd(nod*); void srd(); void traversare_rsd(nod *); void rsd(); void traversare_sdr(nod *); void sdr(); int sumafrunze(nod*); int sfrunza(); int numara(nod *); int numara_nod(); void print(nod *); void tiparire(); void salvare(); nod *inserare_nod(nod *,int ); void operator + (int); void operator - (int); arbbin &operator >(FILE *); arbbin &operator <(FILE *); void inserare_cuv(nod *&,char*); void insert(char *); nod *operator [] (int); ; nod *arbbin::inserare_nod(nod *rad,int k) if (rad) if (k<rad->info) rad->stg=inserare_nod(rad->stg,k); if (k>rad->info) rad->drt=inserare_nod(rad->drt,k); printf("\nnodul exista in arbore!"); return rad; nod *p=new nod; p->stg=null; p->drt=null; p->info=k; return p; void arbbin::operator +(int k)

rad=inserare_nod(rad,k); void arbbin::traversare_srd(nod *rad) if (rad) traversare_srd(rad->stg); printf(" %d",rad->info); traversare_srd(rad->drt); void arbbin::srd() nod *p; p=rad; traversare_srd(p); void arbbin::traversare_rsd(nod *rad) if (rad) printf(" %d",rad->info); traversare_rsd(rad->stg); traversare_rsd(rad->drt); void arbbin::rsd() nod *p; p=rad; traversare_rsd(p); void arbbin::traversare_sdr(nod *rad) if (rad) traversare_sdr(rad->stg); traversare_sdr(rad->drt); printf(" %d",rad->info); void arbbin::sdr() nod *p; p=rad; traversare_sdr(p); void arbbin::print(nod *rad) if (rad) printf("%d",rad->info); if((rad->stg) (rad->drt))

printf("-"); printf("("); print(rad->stg); printf(","); print(rad->drt); printf(")"); void arbbin::tiparire() nod *p; p=rad; print(p); int arbbin::sumafrunze(nod *rad) if (rad) if(!rad->stg&&!rad->drt) return rad->info; return sumafrunze(rad->stg)+sumafrunze(rad->drt); return 0; int arbbin::sfrunza() nod *p; p=rad; return sumafrunze(p); int arbbin::numara(nod *rad) if (rad) return 1+numara(rad->stg)+numara(rad->drt); return 0; int arbbin::numara_nod() nod *p; int nr; p=rad; nr=numara(p); return nr; void arbbin::stergere_nod(nod *&rad,int inf) nod *aux; if (!rad) printf("\nnodul nu exista in arbore!"); if (inf<rad->info) stergere_nod(rad->stg,inf); if (inf>rad->info) stergere_nod(rad->drt,inf);

aux=rad; if (!aux->stg) rad=aux->stg; delete(aux); if(!aux->drt) rad=aux->drt; delete(aux); rad->info=stergere(rad->stg); int arbbin::stergere(nod *&p) if (p->stg) return stergere(p->stg); nod *q=p; int inf=q->info; p=p->stg; delete(q); return inf; void arbbin::operator -(int inform) nod *nou; nou=rad; stergere_nod(nou,inform); nod *arbbin::operator [] (int inf) nod *aux; aux=rad; while(aux&&aux->info!=inf) if (inf<aux->info) aux=aux->stg; if (inf>aux->info) aux=aux->drt; ; if (aux&&aux->info==inf) cout<<"\nnodul cautat exista in arbore!"; cout<<"\nnodul cautat nu exista in arbore!"; return aux; void meniu()

cout<<"\n 1.ADAUGARE NOD DE LA TASTATURA"; cout<<"\n 2.STERGERE NOD DE LA TASTATURA"; cout<<"\n 3.CAUTARE NOD IN ARBORE"; cout<<"\n 4.TRAVERSARI ARBORE-SRD(),RSD(),SDR()"; cout<<"\n 5.SUMA INFORMATIILOR DIN FRUNZE "; cout<<"\n 6.NUMARUL NODURILOR DIN ARBORE"; cout<<"\n 7.AFISARE ARBORE"; cout<<"\n 0.TERMINARE"; void main() arbbin arb; int informatie; char optiune; arb+10;arb+7;arb+15;arb+9;arb+3;arb+8;arb+25; meniu(); optiune='1'; while (optiune!='0') cout<<"\noptiunea dorita este:"; cin>>optiune; if(((optiune>='0')&&(optiune<='9')) (optiune=='n')) switch(optiune) case '1': char op; cout<<"\nnoul nod de introdus:"; cin>>informatie; arb+informatie; cout<<"\nmai doriti adaugarea unui alt nod(d/n)?"; cin>>op; while (op=='d') cout<<"\nnoul nod de introdus:"; cin>>informatie; arb+informatie; cout<<"\nse va mai adauga alt nod(d/n)?"; cin>>op; getch(); meniu(); break; case '2': cout<<"\nnodul care se va sterge:"; cin>>informatie; arb-informatie; getch(); meniu(); break; case '3': int elem; cout<<"\nnodul care va fi cautat:"; cin>>elem; arb[elem]; getch(); meniu(); break; case '4': printf("\narborele traversat in SRD:");

arb.srd(); printf("\narborele traversat in RSD:"); arb.rsd(); printf("\narborele traversat in SDR:"); arb.sdr(); getch(); meniu(); break; case '5': printf("\nsuma inf frunze:%d", arb.sfrunza()); getch(); meniu(); break; case '6': cout<<"\nnumarul de noduri:"<<arb.numara_nod(); getch(); meniu(); break; case '7': printf("\narborele tiparit in RSD:"); arb.tiparire(); getch(); meniu(); break; case '0': break; cout<<"\noptiunea nu exista in meniu!";