Sunteți pe pagina 1din 3

1.

) Scrieti programul C care va permite crearea si vizualizarea unui arbore binar AVL, precum si inserarea unui NOD de cheie data, a.i. dupa inserare, arborele sa ramana tot AVL. Caz II stanga : hs = inaltime subarbore stang hd = inaltime subarbore drept hs < hd hs = hd hs > hd p->ech = 1; p->ech = 0; p->ech = -1; Dupa inserare p->ech = 0; p->ech = -1; reechilibrare!

**Alg. inserare : 1.) se cauta 2.) se inst, fact 0; 3.) se restabilesc factorii de echilibru de pe drumul de cautare conform celor 3 situatii de mai sus. Analizand cazurile STANGA IIa, IIb si IIc se constanta ca sunt aceleasi caracteristicile cazului de reechilibrare. Instr. pt. reechilibrarea arborelui de radacina sunt aceleasi, dar se re stabilesc diferentiat fact. de echilibru a nodrilor care intervin la echilibrare. Vom reuni toate aceste 3 cazuri => Cazul II Stanga. p1->dr = p2->st; p->st = p2->dr; p2->dr = p; p2->st = p1; if(p2-> ech == -1) p->ech = 1; else p->ech = 0; if(p2->ech == 1) p1->ech = -1; else p1->ech = 0; p2->ech = 0; p = p2; Se constata ca daca la revenirea din fct. de inserare a unui NOD in sub` arborele stang al unui NOD radacina, p->ech = -1, am primit indicatia ca acrescut radacina acestuia, at. => se impune reechilibrarea arborelui de radacina p. Pt. a stabili in ce caz de reechilkibrare este, intrucat s-a facut inser area in sub`arborele stang, vom nota cu p1-var care contine adr. radacinii sub`arborelui stang; si analizand factorul de echilibru al lui p1.. daca acesta este -1 => Caz I Stanga 1 => Caz II Stanga. Celelalte 2 situatii de ins. cu reechilibrare in sub`arborele drept(Caz I Dreapta & Caz II Dreapta) se trateaza analog prin simetrie cu cazurile I Stanga si II Stanga, inlocuind pe ste tot st cu dr , si invers.. 1 cu -1 si invers. Se constata deasemenea, ca la fiecare pas al alg. info. care trebuie tra nsmisa trebuie sa ne zica daca a crescut sau nu........

De aceea, in fct. cu inserare prin reechilibrare vom folosi o var. boole ana H (d. la inaltime) a carei val. adevarata reprezinta cresterea inaltimii sub`arborelui in care s-a facut in serarea. => fct. care va realiza inserarea intr`un Arbore AVL, a.i. dupa inserare sa ramana tot AVL : void inserare_echil(int X, ref *p, int &H) { ref p1, p2; if(*p == NULL) { /* NOD-ul nu se afla in arbore => inserare */ (*p) = (ref) malloc(sizeof(Tnod)); (*p)->cheie = X; (*p)->contor = 1; (*p)->st = NULL: (*p)->dr = NULL; (*p)->ech = 0; (*H) 1; } else if(X < (*p)->cheie) /* ramura stanga */ { inserare_echil(X, &((*p)->st), H); if( (*H) == 1) switch( (*p)=>ech ) { case 1: (*p)->ech = 0; (*H) = 0; /* nu se propaga */ break; case 0: (*p)->ech = -1; /* se propaga */ break; case -1: */ p1 = (*p)->st; if(p1->ech == -1) { /* Cazul I Stang a */ ... } else ch = 1; Caz II Stanga */ { p2 = p1>dr; ... } (*H) = 0; break; }/* SWITCH */ } else if(X > (*p)->cheie) { inserare_echil(X, &((*p)->dr), H) if((*H) == 1) switch( (*p)=>ech ) { /* p1->e /* reechilibrare

st <-> dr; 1 <-> -1; } } else { (*p)->cheie ++; (*H)=0; } } Obs: Pt. creearea unui Arbore AVL vom da nodurile pe nivele!!`

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