Professional Documents
Culture Documents
O soluie posibil, care s permit cutarea unui element ntr-un timp mai scurt, este de a utiliza o list nlnuit ordonat, n care elementele sunt aezate n ordine Dar cutarea presupune parcurgerea elementelor, ncepnd cu primul din list i vizitnd n ordine toate elementele, deoarece singura modalitate de a avea acces la un element este de a urma lanul de legturi care conduc la el
Arbori
Arborii, care reprezint una dintre cele mai interesante structuri de date, ofer ambele faciliti:
Inserarea
i tergerea rapid din cazul listelor nlnuite Cutarea rapid din cazul tablourilor
Arbori
Arborii sunt utilizai n descrieri ierarhice, pentru modelarea unor obiecte sau fenomene Descrierea ierarhic se refer la descompunerea unei entiti n subentiti, fiecare dintre ele putnd fi caracterizate printr-un set de atribute sau nsuiri
Arbori
Utiliznd o astfel de descriere, se realizeaz o ierarhizare a prilor unei entiti pe unul sau mai multe niveluri Organizarea ierarhic este ntlnit n diverse domenii: organizarea administrativ a unei companii, planificarea meciurilor n cadrul unui turneu sportiv, evaluarea unor expresii aritmetice
Ce este un arbore
Un arbore const din noduri, care sunt unite prin arce Vom reprezenta nodurile prin cercuri, iar arcele, prin linii care unesc cercurile
Noduri
Nodurile reprezint, de regul, entiti din lumea real, cum ar fi valori numerice, persoane, pri ale unei maini, rezervri de bilete de avion Nodurile sunt elemente obinuite pe care le putem memora n orice alt structur de date
Arce
Arcele dintre noduri reprezint modul n care nodurile sunt conectate Este uor i rapid s ajungem de la un nod la altul dac acestea sunt conectate printrun arc Arcele sunt reprezentate n C i C++ prin pointeri
Ordin (grad)
Numrul de descendeni direci ai unui nod reprezint ordinul sau gradul nodului Ordinul sau gradul arborelui este valoarea maxim luat de gradul unui nod component al arborelui
Tipuri de arbori
Arbori binari, n care fiecare nod dintr-un arbore are cel mult doi fii Arbori multici, n care nodurile pot avea mai muli fii
Arbori
Arbori binari
Dac orice nod din arbore poate avea cel mult doi fii, atunci arborele se numete arbore binar Cei doi fii ai unui nod se numesc fiu stng i, respectiv, fiu drept, n funcie de poziia lor n reprezentarea grafic a arborelui Un nod care nu are niciun fiu se numete frunz
Arbori binari
ntre numrul N de noduri al unui arbore binar i nlimea sa H exist relaiile: H N 2H 1 log2N H N
Cheia fiului stng trebuie s fie mai mic dect cea a printelui, iar cheia fiului drept trebuie s fie mai mare sau egal cu cea a printelui
Arbori neechilibrai
ntr-un arbore neechilibrat, majoritatea nodurilor sunt situate de o singur parte a rdcinii, iar anumii subarbori pot fi, la rndul lor, neechilibrai Dezechilibrarea arborilor poate proveni de la ordinea n care sunt inserate cheile
Cutarea unui nod cu o anumit cheie este cea mai simpl operaie
Dup ce am gsit nodul printe, noul nod va fi conectat ca fiu stng sau drept al acestuia, dup cum valoarea cheii sale este mai mic sau mai mare dect cea a nodului printe
3.1.
ncepnd de la rdcin 3.2. Dac valoarea nodului de inserat este mai mic dect valoarea rdcinii atunci ne deplasm recursiv la stnga 3.3. Dac nu mai este nimic la stnga, se insereaz nodul
Dac valoarea nodului de inserat este mai mare dect valoarea rdcinii atunci ne deplasm recursiv la dreapta 3.5. Dac nu mai este nimic la dreapta, se insereaz nodul
Traversarea arborelui
Traversarea unui arbore presupune vizitarea tuturor nodurilor, ntr-o anumit ordine Traversarea nu este o operaie rapid, dar este util n anumite situaii Exist trei moduri de traversare a unui arbore: inordine, preordine, postordine
Traversarea n inordine
Traversarea n inordine a unui arbore va conduce la vizitarea nodurilor, n ordinea cresctoare a valorilor cheilor acestora Dac dorim s crem o list sortat care s cuprind toate elementele unui arbore binar de cutare, parcurgerea n inordine este o soluie
Traversarea n inordine
Funcia recursiv care traverseaz un arbore este apelat cu un parametru reprezentnd o structur de tip nod, care este chiar rdcina arborelui Funcia trebuie s efectueze trei operaii:
Un
apel recursiv pentru a traversa subarborele stng al nodului Vizitarea nodului curent Un apel recursiv pentru a traversa subarborele drept al nodului
Presupunem c avem de traversat un arbore cu trei noduri: rdcina A, cu fiul stng B i fiul drept C
Traversarea n preordine
nodul Apel recursiv pentru traversarea subarborelui stng Apel recursiv pentru traversarea subarborelui drept
Traversarea n postordine
recursiv pentru traversarea subarborelui stng Apel recursiv pentru traversarea subarborelui drept Viziteaz nodul
//traversare postfixata arbore binar void postfix(tnod * r) { if (r == NULL) return; postfix(r->st); // stanga postfix(r->dr); // dreapta printf(%d , r->val); //radacina }
Dac nodul ters are doi fii, nu l putem nlocui pur i simplu cu unul dintre acetia, cel puin n cazul n care fiul are la rndul su ali fii
Cutarea succesorului
ntr-un arbore binar de cutare, nodurile sunt n ordinea cresctoare a cheilor Pentru un anumit nod, nodul cu cheia imediat superioar se numete succesorul n inordine al nodului, sau pur i simplu succesorul nodului
Cutarea succesorului
Pentru a terge un nod cu doi fii, vom nlocui nodul ters cu succesorul su Aceast operaie pstreaz ordinea elementelor Operaia se complic dac succesorul nodului ters are la rndul su succesori
Cutarea succesorului
Algoritmul se deplaseaz n fiul drept al nodului ters, a crui cheie este mai mare n urmtorul pas, se efectueaz o deplasare n fiul stng al fiului drept (dac exist un astfel de fiu), continundu-se pe ct posibil deplasarea pe o cale alctuit numai din fii stngi Ultimul nod din aceast cale este succesorul nodului iniial
Cutarea succesorului
Nodul pe care l cutm este minimul mulimii de noduri care sunt mai mari dect nodul original Cnd ne deplasm n subarborele drept, toate nodurile de acolo sunt mai mari dect cel iniial, aceasta rezultnd din modul de definire a unui arbore binar de cutare
Cutarea succesorului
Dorim s determinm cea mai mic valoare din acest subarbore Valoarea minim dintr-un arbore se poate determina urmnd calea care pornete de la rdcin i merge numai prin fiii stngi Algoritmul va determina valoarea minim care este mai mare dect nodul original Aceast valoare este chiar succesorul cutat
Cutarea succesorului
Dac fiul drept al nodului nu are fii stngi, succesorul este el nsui
1. succesorParent delNode 2. succesor delNode 3. current delNodedr //deplasare n fiul drept 4. while (current != NULL) //pn cnd nu mai sunt fii stngi 4.1. succesorParent succesor 4.2. succesor current 4.3. current currentst
Pseudocod getSuccesor
Pseudocod getSuccesor
5. if (succesor != delNodedr) //daca succesorul nu este chiar fiul drept //se modifica pointerii 5.1. succesorParentst succesordr 5.2. succesordr delNodedr 6. return succesor
4. succesorst currentst
Observaii
Pasul 1: Dac nodul ters, current, este chiar rdcina, care nu are printe, va fi necesar s atribuim valoarea succesor rdcinii arborelui n caz contrar, nodul ters este fie fiul stng, fie cel drept al unui alt nod Cmpul corespunztor al nodului printe va fi modificat pentru a indica spre nodul succesor
Observaii
Pasul 2: Fiul stng al nodului ters (current) este conectat ca fiu stng al lui succesor Proprietate: Un nod succesor nu va avea niciodat un fiu stng Aceast proprietate este adevrat, indiferent dac succesorul este chiar fiul drept al nodului ters sau unul din descendenii stngi ai acestuia
Observaii
Algoritmul utilizat pentru determinarea succesorului parcurge mai nti fiul drept, apoi descendenii stngi ai acestuia Algoritmul se oprete cnd ajunge la un nod fr niciun fiu stng deci, din definiia algoritmului, este clar c succesorul nu poate avea un astfel de fiu Dac ar fi avut, acel fiu stng ar fi fost succesor n locul su
Observaii
Succesorul poate avea un fiu drept Existena fiului drept nu este o problem dificil, atunci cnd succesorul este fiul drept al nodului ters Cnd deplasm succesorul, subarborele su drept se deplaseaz mpreun cu el Nu exist o suprapunere cu fiul drept al nodului ters, deoarece acest fiu este succesorul nsui
Observaii
Pasul 1 are ca efect nlocuirea succesorului cu subarborele su drept Pasul 2 pstreaz fiul drept al nodului ters n locul potrivit (ceea ce se ntmpla automat atunci cnd succesorul era fiul drept al nodului ters) Paii 1 i 2 sunt executai n instruciunea if din finalul funciei getSuccesor()
Concluzii
Arborii sunt alctuii din noduri, unite prin muchii Rdcina este nodul cel mai din vrf al unui arbore; nu are un nod printe n orice arbore binar, un nod are cel mult doi fii
Concluzii
ntr-un arbore binar de cutare, toate nodurile care sunt descendeni stngi ai unui nod A au chei mai mici dect A; toate nodurile care sunt descendeni drepi ai lui A au chei mai mari (sau egale) fa de A Arborii permit executarea cutrilor, inserrilor i tergerilor ntr-un timp O(logN)
Concluzii
Nodurile reprezint entiti de date memorate n cadrul arborelui Muchiile se reprezint prin pointeri ctre fiii fiecrui nod Traversarea unui arbore presupune vizitarea tuturor nodurilor sale, ntr-o anumit ordine Cele mai simple traversri sunt cele n preordine, inordine i postordine
Concluzii
Un arbore este neechilibrat dac rdcina are mai muli descendeni stngi dect drepi, sau invers Cutarea unui nod presupune compararea valorii cutate cu cheia dintr-un anumit nod i avansul la fiul stng al nodului, dac valoarea cutat este mai mic, respectiv la fiul drept, dac valoarea este mai mare dect cheia nodului
Concluzii
Inserarea unui nod necesit gsirea locului potrivit i apoi modificarea unuia din pointerii nodului printe, astfel nct noul nod s devin fiul acestuia Traversarea n inordine realizeaz vizitarea nodurilor dintr-un arbore de cutare n ordine cresctoare Traversrile n preordine i postordine sunt utile la evaluarea expresiilor aritmetice
Concluzii
Dac un nod nu are fii, poate fi ters, atribuind pointerului corespunztor printelui valoarea NULL Dac un nod are un singur fiu, poate fi ters, conectnd fiul la pointerul corespunztor printelui acelui fiu Dac un nod are doi fii, tergerea se efectueaz prin nlocuirea acestuia cu succesorul su
Concluzii
Succesorul nodului A este nodul cu valoarea minim din subarborele drept al lui A (a crui rdcin este deci fiul drept al lui A) La tergerea unui nod cu doi fii, apar mai multe cazuri, dup cum succesorul este chiar fiul drept al nodului ters sau un descendent stng al acestuia