Arbori P 1

Descărcați ca pptx, pdf sau txt
Descărcați ca pptx, pdf sau txt
Sunteți pe pagina 1din 87

Structuri de date Arbori

1. Noiunea de arbore
2. Arbori oarecare
3. Arbori binari
4. Crearea si parcurgerea unui arbore binar
5. Arbori binari de cautare
6. Arbori binari echilibrati
7. Arbori optimi
8. Arbori orecare
ntroducere

Pentru multe aplicaii, timpul de acces la informaie cuprins


ntr-o list este foarte mare. Deasemenea, pentru modelarea
diferitor fenomene sau obiecte de natur este necesar
folosirea structurilor ierarhice.

Prin descrierea irarhic s nelege descompunerea unei


entiti n mai multe subentiti cu o structur analogic ( ex.
Structura administrativ, arbore genenealogic, planificarea
meciurilor, evaluarea unor expresii de calcul e.t.c.)
Noiunea de arbore
Un arbore reprezint o structur de date ce modeleaz
o ierarhie de elemente.

Astfel, fiecare element, numit nod, poate deine un


numr de unul sau mai muli descendeni, iar n acest
caz nodul este numit printe al nodurilor descendente.

Fiecare nod poate avea un singur nod printe. Un


nod fr descendeni este un nod terminal, sau nod
frunz.

n schimb, exist un singur nod fr printe, iar acesta


este ntotdeauna rdcina arborelui.
Exemplu de arbore oarecare

Exemplu de arbore oarecare:

Parcurgerea n adncime a acestui arbore: 1 2 5 6 3 7 4 8.


Parcurgerea n lime: 1 2 3 4 5 6 7 8.
Arbore cu radacina
Arbori binari

Un arbore binar este un caz special de arbore, n care fiecare


nod poate avea maxim doi descendeni:
nodul stng
nodul drept.

Structura de arbore binar poate fi utilizat pentru a reprezenta


n mod convenabil o mulime de elemente, n care elementele
se regsesc dup o cheie unic.
Arbori
Arboribinari
binari

Sa presupunem c avem o mulime de n noduri definite ca


articole, fiecare avnd cte o cheie care este numr ntreg.
Dac cele n articole se organizeaz ntr-o structur de list
liniar, cutarea unei chei necesit n medie n/2
comparaii.
Dup cum se va vedea n continuare, organizarea celor n
articole ntr-o structur convenabil de arbore binar,
reduce numrul de cutri la maximum log2n.
Acest lucru devine posibil utiliznd structura de arbore
binar ordonat.
Arbori binari
Arbori binari ordonai de diferite nlimi
Arbori binari
Arbori binari ordonai de diferite nlimi
Se precizeaz ns, c aceast afirmaie este
valabil n ipoteza c nodurile s-au organizat
ntr-o structur de arbore binar ordonat de
nlime minim.
Dac aceast condiie nu este satisfcut,
eficiena procesului de cutare poate fi mult
redus, n cazul cel mai defavorabil arborele
degenernd ntr-o structur de list liniar.
Aceasta se ntmpl cnd subarborele drept
(stng) al tuturor nodurilor este vid, caz n care
nlimea arborelui devine egal cu n, iar
cutarea nu este mai eficient dect
cutarea ntr-o list liniar ( O (n/2)).
Reprezentarea arborilor binari

Arborii binari pot fi reprezentai n mai multe moduri.


Structura din spatele acestora poate fi un simplu
vector, alocat dinamic sau nu, sau o structur ce
folosete pointeri.

n funcie de elementele ce pot fi reprezentate n noduri


i de restriciile aplicate arborelui, se pot crea structuri
de date cu proprieti deosebite: heap-uri, arbori AVL,
arbori rou-negru, arbori Splay i multe altele.
Reprezentarea shematic
Reprezentarea generalizat a unui arbore binar

Nivel 0
A
Nivel 1
B C
Nivel 2

D E F G

Nivel 3
H I J
Arbore binar ordonat

Un arbore binar ordonat se bucur de urmtoarea


proprietate:
dac n este un nod oarecare al arborelui, avnd cheia
c, atunci:
toate nodurile din subarborele stng a lui n au
cheile mai mici sau egale cu c
toate nodurile din subarborele drept al lui n au chei
mai mari sau egale cu c.
Nodul unui arbore binar ntr-o structur
nlanuit

struct tnode
{ tip inf;
struct tnode *left;
struct tnode *right;
};

Unde tip este tipul de date a datelor n nod (inf)


Arbore binar ordonat
De aici rezult un procedeu foarte simplu de cutare:
ncepnd cu rdcina, se trece la fiul stng sau la fiul drept,
dup cum cheia cutat este mai mic sau mai mare dect cea a
nodului curent.

Numrul comparaiilor de chei efectuate n cadrul acestui


procedeu este cel mult egal cu nlimea arborelui.

Din acest motiv aceti arbori sunt cunoscui i sub denumirea


de arbori binari de cutare (Binary Search Trees).

n general nlimea unui arbore nu este determinat de


numrul nodurilor sale.
Arbori binari ordonai de diferite nlimi
Inalimea arborelui binar depinde de ordinea n care se
furnizeaz iniial cheile.Dac spre exemplu avem o secven
5 , 3 , 8 , 2 , 4 , 7 , 9 , 1 , 6 vom obine arbore a), dar pentru
secvena 7 , 2 , 8 , 1 , 6 , 9 , 3 , 5 , 4 - b )
Arbori binari ordonai de diferite
nlimi
Este simplu de observat c un arbore are nlimea minim
dac fiecare nivel al su conine numrul maxim de noduri, cu
excepia posibil a ultimului nivel.

Deoarece numrul maxim de noduri al nivelului i este 2i-1,


rezult c nlimea minim a unui arbore binar cu n noduri
este:

Prin aceasta se justific i afirmaia c o cutare ntr-un arbore


binar ordonat necesit aproximativ log2n comparaii de chei
Arbori binari ordonai de diferite
nlimi

Aceast afirmaie este valabil n ipoteza c nodurile s-


au organizat ntr-o structur de arbore binar ordonat de
nlime minim.
Dac aceast condiie nu este satisfcut, eficiena
procesului de cutare poate fi mult redus, n cazul cel
mai defavorabil arborele degenernd ntr-o structur de
list liniar.
Aceasta se ntmpl cnd subarborele drept (stng) al
tuturor nodurilor este vid, caz n care nlimea arborelui
devine egal cu n, iar cutarea nu este mai eficient
dect cutarea ntr-o list liniar ( O (n/2)).
Arbori binari ordonai degenerai n
liste liniare.
Tipul de date abstract arbore binar ordonat
Definirea tipului abstract de date Arbore binar ordonat, ca si
altor tipuri de date abstracte presupune:
Definirea modelului matematic asociat i
Precizarea setului de operatori.
Modelul matematic : este un arbore binar, fiecare nod
avnd asociat o cheie specific. Pentru fiecare nod al
arborelui este valabil urmtoarea proprietate: cheia
nodului respectiv este mai mare dect cheia oricrui nod
al subarborelui su stng i mai mic decat cheia
oricrui nod al subarborelui su drept.
Ca i pentru celelalte structuri studiate i n acest caz este
greu de definit un set de operatori general valabil.
Operatii asupra arborilor binari

Inserarea unui nod-frunza in arbore


Accesul la un nod al arborelui
Extragerea unui nod din arbore
Parcurgerea unui arbore
Cutarea unui element-cheie
Stergerea unui arbore
Inseria nodurilor n ABO. Crearea arborilor
binari ordonai
Procesul de creare al unui ABO const n inseria cte unui
nod ntr-un arbore binar ordonat care iniial este vid.
Inseria se execut astfel ca arborele s rmn ordonat i
dup adugarea noului nod.
Acesta se realizeaz traversnd arborele ncepnd cu
rdcina i selectnd fiul stng sau fiul drept, dup cum
cheia de inserat este mai mic sau mai mare dect cheia
nodului parcurs.
Acest proces se repet pn cnd se ajunge la un pointer
NUUL.
n continuare inseria se realizeaz modificnd acest
pointer astfel nct s indice noul nod.
Inserarea i stergerea unui nod
Inserarea unui nod se face, n funcie de rezultatul
comparaiei cheilor, n subarborele stng sau drept. Dac
arborele este vid, se creaz un nod care devine nodul
rdcin al arborelui.
tergerea unui nod este o operaie mai complicat,
ntruct presupune o rearanjare a nodurilor. Pentru
eliminarea unui nod sunt posibile urmtoare cazuri:
nodul de ters nu exist, operaia se consider ncheiat
nodul de ters nu are succesori (este o frunz)
nodul de ters are un singur successor
nodul de ters are doi succesori
Inseria unui nod nou cu o cheie existent
Inseria unui nod nou cu o cheie existent
Se precizeaz c inseria noului nod trebuie realizat chiar
dac arborele conine deja un nod cu cheia egal cu cea
nou.

Dac se ajunge la un nod cu cheia egal cu cea de inserat,


se procedeaz ca i cum aceasta din urm ar fi mai mare,
deci se trece la fiul drept al nodului curent.

n felul acesta la parcurgerea n inordine a arborelui binar


ordonat se obine o metod de sortare stabil
tergerea unui nod
n cazul tergerii unui nod frunz sau a unui
nod avnd un
singur successor, legtura de la parintele nodului
de ters este nlocuit prin legtura nodului de
ters la succesorul su (care poate fi NULL).

Eliminarea unui nod cu doi succesori se


face prin
nlocuirea sa cu nodul care are cea mai
apropiat valoare de nodul ters. Nodul ce se
suprim x se nlocuete cu :
cel mai mare nod al subarborelui stng al subarborelui binar
care are rdcina x, sau se caut nodul cu cea mai mic cheie
Suprimarea nodurilor n arbori binari ordonai
Dac se cere s se suprime din structura de arbore nodul
avnd cheia x:
n prealabil se caut dac exist un nod cu o astfel de cheie.
Dac nu se gasete, suprimarea s nchide i se emite
eventual un mesaj de eroare.
n caz contrar se execut suprimarea propriu-zis, de o
asemenea manier nct arborele s rmn ordonat i
dup terminarea ei.
Se disting dou cazuri, dup cum nodul care trebuie suprimat
are:
(1) Cel mult un fiu
(2) Doi fii.
Suprimarea unui nod ntr-un ABO. Cazul 1.
Din arbore binar ordonat se suprim n mod succesiv
nodurile avnd cheile 7, 8, 4, i 6
Principalele modalitati de parcurgere ale unui arbore binar sunt:

Parcurgerea in inordine
(stanga varf dreapta SVD)
Parcurgerea in preordine
(varf - stanga dreapta VSD)
Parcurgerea in postordine
(stanga dreapta varf SDV)

Ca urmare a parcurgerii arborelui se obine o soluie sub forma


unui tablou unidimensional (vector).
Parcurgerea n preordine a arborelui binar

Solutia este: 1,2 3,4 5,6,7


Parcurgerea n inordine a arborelui binar

Solutia este: 2, 1 ,6 , 4, 3, 7, 5
Parcurgerea n postordine a arborelui binar

Solutia este: 2, 6, 4, 7, 5, 3, 1
Solutiile de parcurgere a arborelui prezentat sunt:
E x e m p l u 1 . S e v a e l a b o r a u n p rog r a m p e n t r u
i m p l e m e n t a re i p a rcu r g e re u n u i a r b o re b i n a r
#include <stdio.h>
#include <conio.h>
#include <alloc.h>
struct Node
{ int d;
Node *left;
Node *right;
};
// Crearea primului nod
Node * first(int d);
// Inserarea inui nod nou
Node * search_insert(Node *root, int d);
// Parcurgerea arbotrelui
void print_tree(Node *root, int l);
Ex.1. Continuare

int main()
{ int b[] = {10, 25, 20, 6, 21, 8, 1, 30};
//Declarm i iniializm pointerul root
Node *root = first(b[0]);
//Inserm noduri n arbore
for (int i=1; i<8; i++) search_insert(root , b[i]);
clrscr();
// Afisam arbore
print_tree(root , 0);
getch();
return 0;
}
Ex.1. Continuare

//funcia pentru crearea rdcinei


Node *first(int d)
{ Node *pv = new Node;
pv->d = d;
pv->left = 0;
pv->right = 0;
return pv;
}
Ex.1. Continuare

Node * search_insert(Node *root,int d)


{ // Crearea primului nod-rdcin
Node *pv=root, *prev;
int found = 0;
while (pv && !found)
{ prev = pv;
if (d == pv->d) found = 1;
else
if (d < pv->d) pv = pv->left;
else pv = pv->right;
}
if (found) return pv;
Ex.1. Continuare

//Crearea noului nod-frunz


Node *pnew = new Node;
pnew->d=d;
pnew->left = 0;
pnew->right = 0;
if (d < prev->d) prev->left = pnew;
else prev->right=pnew;
return pnew;
}
Ex.1. Continuare. Parcurgerea arborelui pe nivele

void print_tree ( Node *p, int level )


{ if (p)
{ print_tree( p->left, level+1 );
for(int i=0; i<level; i++)
printf(" ");
printf("%d\n", p->d);
print_tree ( p->right, level+1 );
}
}
Screenshot - rezultat
Arbori binari. Exemplu 2
Presupunem c vrem s tratm problema contorizrii
cuvintelor dintr-un text.
Fiecare nod al arborelui conine o structur cu urmtoarele
informaii:
Un pointer la cuvnt
Un contor care numr apariiile cuvntului
Un pointer la subarborele stng
Un pointer la subarborele drept

n continuare vom elabora o varianta recursiv a programului


pentru rezolvarea problemei contorizrii cuvintelor din
intrare. Cuvintele vor fi citite dintr-un fiier text Cuvinte.txt
Arbori binari. Exemplu 2

Vom crea arborele astfel nct n subarborele stng al


oricrui nod s avem numai cuvinte care sunt mai mici
(lexicografic) dect cuvintele din nod

In subarborele drept al oricrui nod s avem numai


cuvinte care sunt mai mari (lexocografic) dect cuvntul
din nod.
Arbori binari. Exemplu 2

Pentru a vedea dac un cuvnt a mai fost ntlnit, procedm


n felul urmtor: pornim de la rdcin i comparm
cuvntul nou cu cuvntul din acel nod.

n caz de egalitate, incrementm contorul. Dac noul


cuvnt este mai mic dect cuvntul din nod, cutarea se
face n subarborele stng, iar n caz contrar n subarborele
drept.

Dac procesul de cutare nu mai poate continua (nodul n


care am ajuns nu mai are ali subarbori), cuvntul va fi
plasat n arbore n locul corespunztor.
Exemplu 2
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <conio.h>
#define MAXWORD 100
struct tnode
{ char *word;
int count;
struct tnode *left;
struct tnode *right; };

struct tnode * addtree( struct tnode *, char * );


void treeprint( struct tnode * );
Exemplu 2
int main()
{ struct tnode *root;
char word[MAXWORD];
FILE *fp;
root = NULL;
fp = fopen(Cuvinte.txt", "r");
if( fp == NULL) { fprintf(stderr, Fisierul nu se
deschide\n"); return 1; }
do
{ fscanf(fp, "%s", word);
if( word[0] != '\0' )
root = addtree(root, word);
} while(!feof(fp)); clrscr();
treeprint( root ); return 0; }
Exemplu 2
struct tnode * addtree( struct tnode *p, char *w )
{ int cond;
if( p == NULL)
{ p = (struct tnode*)malloc( sizeof(struct tnode) );
p->word = strdup(w);
p->count = 1;
p->left = p->right = NULL; }
else if( (cond = strcmp(w, p->word)) == 0 )
p->count++; // cuvintul deja exista in arbore
else if( cond < 0 )
p->left = addtree( p->left, w);
else p->right = addtree( p->right, w);
return p;
}
Exemplu 2
void treeprint( struct tnode * p)
{
if( p != NULL )
{
treeprint( p->left );
printf("%s %d\n", p->word, p->count );
treeprint( p->right );
}
}
Rezultatul rulrii exemplului 2
Fisierul Cuvinte.txt contine:
Interesant este este interesant daca este obiectul Structuri de
date si algoritmi este un obiect interesant interesant
Arbori binari de cautare

Un arbore binar de cautare este un caz particular ale


arborilor binari, organizat astfel c nu conine chei-elemente
identice/egale i care are proprietatea , c prin parcurgerea n
inordine a nodurilor, se obine o secven monoton
cresctoare a cheilor.

Pentru orice nod ale arborelui de cutare, cheia acestuia are


o valoare mai mare dect cheile tuturor nodurilor din
subarborele stng, i mai mic dect cheile nodurilor ce
compun subarborele drept.
Arbore binar de cautare pentru un ir de valori
23, 10, 27, 18, 3, 2
Arbori binari de cautare

O important proprietate a arborilor de cutare, este


aceea c parcurgerea n inordine produce o secventa
ordonat cresctor a cheilor din nodurile arborelui.

Valoarea maxim dintr-un arbore binar de cutare se


afl n nodul din extremitatea dreapt i se determin
prin coborrea pe subarborele drept, iar valoarea
minim se afl n nodul din extremitatea stng.
Cutarea unei chei ntr-un arbore binar de cutare

este asemntoare cutrii binare: cheia


cutat este comparat cu cheia din
nodul curent (iniial nodul rdcin). In
funcie de rezultatul comparaiei apar trei
cazuri:
acestea coincid elementul a fost gsit
elementul cutat este mai mic dect
cheia din nodul curent atunci cutarea
continu n subarborele stng
elementul cutat este mai mare dect
cheia din nodul curent - atunci cutarea
continu n subarborele drept
Exemplu 3. Un cod pentru cautare valorii minime
n arbore binar ordonat
#include <stdio.h>
#include <conio.h>
#include <alloc.h>
struct Node
{ int d;
Node *left;
Node *right; };
Node * insert(Node *root,int d);
Node * tree_min(Node *p);
Node * root, *pf, *pv, *p;
Exemplu 3. Un cod pentru cautare valorii minime
in arbore binar ordonat
int main()
{
int b[] = { 12, 4, 22, 6, 9, 1, 2, 3 } ;
clrscr();
printf("%d\n",b[0]); root=NULL;
pf = insert( root, b[0] );
p=pf;
for (int i=1;i<8;i++) p=insert(pf, b[i]);
p = tree_min( pf );
printf("min=%d", p->d);
getch();
return 0;
}
Exe.3. Continuare
Funcia crerii unui arbore binar ordonat

Node * insert(Node *root, int d)


{ Node *pv;
pv = root;
if (root==NULL)
{ pv = new Node;
pv->d=d; pv->left=0; pv->right=0; }
else
{ if (d < pv->d) pv->left = insert(pv->left,d);
else pv->right = insert(pv->right,d); }
return pv;
}
Exemplu 3. Continuare

/* Funcia de cautare unui nod cu cheie minim*/


Node * tree_min(Node *p)
{ while (p->left !=NULL)
{
p=p->left;
printf("%d ", p->d);
}
return p;
}
Arbori binari echilibrai. Arbori AVL

Un arbore AVL definit prima dat de G.M.


Adelson-Velskii i E.M.Landis n 1962 este un
arbore binar echilibrat n nalime.

Un arbore binar ordonat este echilibrat dac i


numai dac nlimile celor doi subarbori ai si
difer cu cel mult 1.

Arborii care satisfac acest criteriu se numesc


"arbori AVL" dup numele inventatorilor.
Arbori binari echilibrai. Arbori AVL
Nodurile 9 sau 11 pot fi inserate fr
reechilibrare. Inseria unuia din nodurile 1,3,5 sau
7 necesit ns reechilibrarea arborelui.
Arbori binari echilibrai. Arbori AVL
Un arbore binar este AVL dac gradul de echilibru a fiecrui
nod ia valori n mulimea {-1,0,1}

Pentru a msura gradul de echilibru unui nod se definete


indicatorul GE ce decrie relaia:
GE= H(SD)-H(SS)
Unde SD - subarb_drept, SS - subarb_sting

Pentru a determina nalimea unui arbore cu rdacina rad


H(rad)= 1+max(H(subarb_dr), H(subarb_st))
Arbore binar echilibrat
Dup nserarea nodului cheie 1
arbore binar devine dezechilibrat
Reechilibrarea arborelui binar

Reechilibrarea arborelui binar de cutare i pstrarea caracteristicilor


aferente arborilor AVL se realizeaz prin operaii de rotire:

rotire simpla la stnga;

rotire simpla la dreapta;

dubla rotire la stnga ;

dubla rotire la dreapta.


Procesul de rotire simpl la
dreapta
Arbore reechilibrat
Exemple de reechilibrare a arborelor binari
Arbori binari perfect echilibrai

Se numeste arbore binar total echilibrat (sau perfect


echilibrat), un arbore n care, pentru fiecare nod, numarul
nodurilor din subarborele sau stang difera cel mult cu unu de
cel al nodurilor subarborelui drept. In consecinta, toate
nodurile terminale ale unui asemenea arbore sunt pe ultimele
doua nivele.

Arborii perfect echilibrai sunt de asemenea arbori de tip


AVL.
Exemplu unui arbore binar de cautare
perfect echilibrat 1 2 3 4 5 6 7
Arbori binari parial ordonai
O structur aparte de arbore binar o reprezint
structura de arbore binar parial ordonat.
Caracteristica esenial a unui astfel de arbore
este aceea c cheia oricrui nod nu este mai mare
(mic) dect cheile foilor.
Reprezentarea unui arbore binar
parial ordonat ca un ansamblu
Deoarece un arbore binar parial ordonat este de fapt un arbore
binar, se poate realiza o reprezentare eficient a sa cu ajutorul
unui tablou liniar
Aceast reprezentare este cunoscut i sub numele de ansamblu
(heap)
La o analiz mai atent se observ c de fapt un ansamblu este
din punct de vedere al reprezentrii un arbore binar complet.
Spre exemplu arborele binar parial ordonat din slaidul
precedent poate fi reprezentat i ca un ansamblu
Arbori asociai expresiilor
O expresie matematic este un ir de caractere compus
din:
variabile
constante
operatori
(eventual) paranteze.
Fiecrei expresii i se poate asocia un arbore
binar, n care:
nodurile interioare reprezint operatorii
frunzele reprezint constantele sau variabilele.

n terminologia limbajelor formale i a compilatoarelor,


acest arbore se mai numete i Abstract Syntax Tree
(AST).
Pentru expresia (a+1)*(b+10)+25/c ,
arborele asociat este prezentat mai jos:
Arbori Binari Optimi
Despre arbori binari optimi putem vorbi atunci cand,
pentru fiecare dintre cheile unui arbore binar ordonat
cunoastem frecventa cu care aceasta cheie va aparea
in cadrul operatiilor ulterioare de cautare

Aceasta frecventa poate fi vazuta si ca probabilitatea


ca o anumita cheie sa fie subiectul (argumentul) unei
operatii viitoare de cautare in arborele binar ordonat

Vorbim despre operatii de cautare deoarece, in general,


acestea sunt cele care ne intereseaza atunci cand lucram
cu arbori binari ordonati
Arbori Binari Optimi

Pentru o cheie oarecare, timpul de cautare va fi, in cel


mai rau caz proportional cu inaltimea arborelui

Pentru o cheie care exista in arbore, timpul de cautare


este proportional cu adancimea nodului care contine
cheia (distanta de la acesta la radacina)

Ideal ar fi ca acele chei care sunt cautate mai des sa fie


plasate mai aproape de radacina arborelui iar acele chei
care sunt cautate mai rar sa fie plasate mai departe de
radacina arborelui
Arbori Binari Optimi
De exemplu, am putea considera, ca o aplicatie, ca toate cuvintele limbii
romane sunt chei intr-un arbore binar ordonat, dispuse intr-un anumit fel
Acest arbore binar ordonat va fi folosit de un dictionar pentru a obtine
pentru fiecare cuvant, traducerea sa intr-o limba straina
Evident, anumite cuvinte vor fi cautate mai des decat altele

Fiecare cuvant ar putea avea (teoretic) asociata o probabilitate de aparitie

Cuvintele cu probabilitate de aparitie mai mare (mama, tata, etc.) ar fi


bine sa fie mai apropiate de radacina arborelui decat cuvintele cu
probabilitate de aparitie mai mica (metempsihoza, parapsihologie, etc.),
dintre care multe nici nu vor fi cautate vreodata
Astfel apare ideea pe care se bazeaza arborii binari optimi
Arbori Binari Optimi

Fie un arbore binar ordonat continand cheile k1 , k2 , ,


kn

Consideram ca fiecare cheie ki are asociata o


probabilitate de aparitie pi

Distributia probabilitatilor pi asigura urmatoarele conditii:


0 pi 1, unde i = 1 .. n
p 1 + p2 + + pn = 1

Arborele binar ordonat poate fi numit optim daca:


DP = p1 adancime(k1) + + pn adancime(kn) =
minim
Arbori Binari Optimi

Suma anterioara poarta numele de drum ponderat, fiind


suma drumurilor de la radacina la fiecare nod, ponderate
cu probabilitatile de acces la noduri.

Pentru ca drumul ponderat DP sa fie minim, trebuie ca o


probabilitate de acces (pi) mare (adica o cheie cutata des)
s fie insotit de o adncime (adancime(ki)) mica (adic o
distant mic pan la radacina arborelui)
Arbori Binari Optimi
Vom construi toi arborii binari ordonai forma i
cu cheile 1, 2 i 3
Arbori Binari Optimi
Presupunem ca cele 3 chei (1, 2 si 3) au
asociate urmatoarele probabilitati de aparitie:
1 1/7; 2 2/7; 3 4/7
1/7 + 2/7 + 4/7 = 1 (asa cum cere regula)

Vom calcula suma DP pentru fiecare din cei 5


arbori
Arbori Binari Optimi
Avand valoarea DP minima, arborele 5 este cel optim, chiar daca nu
este arbore perfect echilibrat si nici macar AVL

Calitatea de arbore optim este data strict de probabilitatile de


aparitie ale cheilor

Practic, rezultatul obtinut ne spune ca daca un numar foarte mare de


cautari de chei in arborele 1 se face in 17 secunde, de exemplu, atunci
aceleasi cautari de chei vor necesita 15 secunde in arborele 2 si 11
secunde in arborele 5 (vezi valorile DP calculate pentru fiecare
arbore)

Evident, cautarile vor duce la acelasi rezultat indiferent de arborele


in care se fac, difera doar timpul in care se obtine acest rezultat

Cel mai scurt timp se va obtine intotdeauna in arborele optim


Exemplu
Vom scrie un program pentru crearea unui arbore oarecare pe care l
vom parcurge n dou moduri folosite de obicei pentru parcurgerea
arborilor oarecare:
parcurgerea n adncime (deapth first) n care se viziteaz prima
dat rdcina, apoi subarborii de la stnga la dreapta;
parcurgerea n lime (breadth first) presupune parcurgerea pe
nivele a arborelui.
Rdcina arborelui se consider c este pe nivelul 0
Toate nodurile legate direct de rdcina se consider pe nivelul
1 etc.
Pentru fiecare nod se cere informaia din nod, care n cazul
nostru va fi un numr ntreg, i numrul de fii ai acelui nod.
Crearea arboreului se face n funcia recursiv crearb.
Funciile padinc i plat sunt funciile pentru parcurgerea
arborelului n adncime respectiv n lime.
Exemplu
#include <stdio.h>

struct nod
{ int inf;
int dim;
struct nod* tab[100];
};
struct nod * crearb();
/* Functia pentru parcurgerea in adincime */
void padinc(struct nod *);
/*Functia pentru parcurgerea in latime*/
void plat(struct nod *);
Exemplu
int main()
{ struct nod *root;
clrscr();
/*Creez arborele*/
root = crearb();
printf("Parcurgere in adincime:");
padinc(root);
printf("\nParcurgere in latime:");
plat(root);
return 0;
}
Exemplu
struct nod * crearb()
{
int inf, n, i;
struct nod *p;
printf("Inf=");
scanf("%d", &inf);
p = malloc( sizeof(struct nod) );
p->inf = inf;
printf("Cati fii are?");
scanf("%d", &n);
p->dim = n;
for(i = 0; i < n; i++)
p->tab[i] = crearb();
return p;
}
Exemplu
void padinc(struct nod *p)
{
int i;
if( p != NULL )
{
printf("%d", p->inf);
for( i = 0; i < p->dim; i++)
padinc( p->tab[i] );
}
}
Exemplu
void plat(struct nod *p)
{ struct nod *queue[100];
struct nod *t; int front = 0, back = 0;
int i;
queue[ front++ ] = p;
while ( ! (front == back) )
{
t = queue[ back ]; back++;
printf("%d", t->inf);
for(i = 0; i < t->dim; i++)
queue[ front++ ] = t->tab[i];
}
}
ARBORI BINARI

Succes in Invatare !!!!

S-ar putea să vă placă și