AVL δέντρα L - R 1 L R G.M. AdelsonVelkii και E.M. Landis 1962
AVL Δέντρα
Μη AVL Δέντρα
Εισαγωγή κόμβου 4, 6 : 4 12 : 6 4 6 Αριστερή στροφή 6 4 12 12
8, 14 : 6 4 12 8 14
7 : 4 6 12 6 4 8 6 8 12 7 8 14 Δεξιά στροφή 7 Αριστερή στροφή 12 14 4 7 14
4 Περιπτώσεις LL : ο νέος κόμβος Υ εισάγεται στο αριστερό υποδέντρο του αριστερού υποδέντρου του Α. LR : ο νέος κόμβος Υ εισάγεται στο δεξί υποδέντρο του αριστερού υποδέντρου του Α. RR : ο νέος κόμβος Υ εισάγεται στο δεξί υποδέντρο του δεξιού υποδέντρου του Α. RL : ο νέος κόμβος Υ εισάγεται στο αριστερό υποδέντρο του δεξιού υποδέντρου του Α.
Περίπτωση 1 (RR) : Δεξιά Υψηλό Τ 1 p. r Αριστερή στροφή x. prosorinos p. r 1 2 +1 3 p. 4. prosorinos x +1 Τ 3 Τ 2 Τ 3 Τ 1 Τ 2 Συνολικό ύψος = +3 νέος Συνολικό ύψος = +2
typedef enum{true, FALSE}; typedef enum{ay, IY, DY} paragonisozygisis; typedef struct typoskomvou *typosdeikti; typedef struct typoskomvou{ typosstoixeiou dedomena; typosdeikti apaidi, dpaidi; paragonisozygisis pi; } typoskomvou;
void aristeriperistrofi (typosdeikti *p);{ /*Ο p δείχνει τη ρίζα του υποδέντρου που περιστρέφεται*/ typosdeikti prosorinos; if (kenodentro(*p)) /*Είναι αδύνατη η περιστροφή*/ printf( Κενό δέντρο ) /*ενός κενού δέντρου*/ else if (kenodentro((*p)->dpaidi)) /*Είναι αδύνατο να γίνει ρίζα ένα κενό υποδέντρο*/ printf ( Κενό δεξί υποδέντρο ) else{ prosorinos = (*p)->dpaidi; (*p)->dpaidi = prosorinos->apaidi; prosorinos->apaidi =* p; *p = prosorinos; } } /*aristeriperistrofi*/
Περίπτωση 2 (RL):Αριστερά Υψηλό 2 r w 1 Τ 1-1 ή Τ 2 ή - 1 ή Τ 3 Τ 4 νέος νέος Ενα από τα Τ 2 ή Τ 3 έχει ύψος..συνολικό ύψος = +3
r w Τ 1 x Τ 2.Συνολικό ύψος = +3 Τ 3-1 Τ 4
w r x Τ 1 Τ 2 Τ 3 Τ 4.Συνολικό ύψος = +2 Αποκατάσταση ισοζύγισης (διπλή RL περιστροφή). Οι αριθμοί στους κύκλους δηλώνουν την προτεραιότητα των ενεργειών.
παλιό w νέο r νέο x
H αποκατάσταση της ισοζύγισης με τις RR και RL περιστροφές υλοποιείται με το παρακάτω υποπρόγραμμα. void dexivaros(typosdeikti *riza,boolean *ypsilotero){ typosdeikti x; //δείκτης στο δεξί υποδέντρο της ρίζας typosdeikti w; x = (*riza)->dpaidi; switc (x->pi){ case DY: //απλή RR περιστροφή (*riza)->pi = IY; x->pi = IY; aristeriperistrofi(riza); *ypsilotero = FALSE; break; case IY: /*Δεν συμβαίνει η περίπτωση αυτή*/ printf ( Λάθος ); break; συνέχεια
case AY:/*διπλή RL περιστροφή*/ w = x->apaidi; switc (w->pi){ case IY: (*riza)->pi=iy; x->pi= IY; break; case AY: (*riza)->pi=iy; x->pi= DY; break; case DY: (*riza)->pi=ay; x->pi= IY; break; } w->pi=iy; dexiaperistrofi(&x); /*o x δείχνει τώρα τον w*/ (*riza)->dpaidi = x; aristeriperistrofi(riza); ypsilotero = FALSE; } // of switc }/*dexivaros*/
Tο υποπρόγραμμα εισαγωγής ενός κόμβου σε ένα AVL δέντρο είναι το ακόλουθο : void avleisagogi (typosdeikti *riza, typosdeikti prosorinos, typosdeikti stoixeio, boolean *ypsilotero) { συνέχεια
if (kenodentro(*riza)){ *riza = prosorinos; (*riza)->apaidi = NULL; (*riza)->dpaidi = NULL; (*riza)->pi = IY; *ypsilotero = TRUE;} else if (prosorinos->dedomena==(*riza)->dedomena) printf( Ο κόμβος υπάρχει ήδη στο ΔΔΑ ); else if (prosorinos->dedomena<(*riza)->dedomena){ /*εισαγωγή στο αριστερό υποδέντρο*/ avleisagogi(&((*riza)->apaidi)), prosorinos, stoixeio, ypsilotero); συνέχεια
} if (*ypsilotero) switc ((*riza)->pi){ case AY: aristerovaros(riza, ypsilotero); break; case IY: (*riza)->pi=ay; *ypsilotero=true; break; case DY: (*riza)->pi=iy; *ypsilotero=false; break; } συνέχεια
else{/*εισαγωγή στο δεξί υποδέντρο*/ avleisagogi (&((*riza)->dpaidi), prosorinos, stoixeio, ypsilotero); if (*ypsilotero) switc ((*riza)->pi){ case AY: (*riza)->pi=iy; *ypsilotero=false; break; case IY: (*riza)->pi=dy; *ypsilotero=true; break; case DY: dexivaros(riza, ypsilotero); break; } } } }/*avleisagogi*/
Διαγραφή p p Αμετάβλητο ύψος Τ1 Τ1 Τ2 Τ2 διαγράφτηκε p Περίπτωση 1 Ελαττωμένο ύψος Τ1 Τ2 Τ1 Τ2 διαγράφτηκε Περίπτωση 2
p q q p Αμετάβλητο ύψος -1 Τ1-1 Τ1 Τ3 Τ2 Τ3 Τ2 διαγράφτηκε Περίπτωση 3a
p q q p Ελαττωμένο ύψος -1 Τ1-1 -1 Τ1 Τ2 Τ3 Τ2 διαγράφτηκε Τ3 Περίπτωση 3b
-1 Τ1 r p r q p Αμετάβλητο ύψος q -1-1 Τ2-1 ή Τ3-1 Τ2-1 -2 ή Τ3 Τ4 Τ1 Τ4-2 Περίπτωση 3c Σχήμα 8.22 Διάφορες περιπτώσεις διαγραφής κόμβου από ένα AVL δέντρο.
Το ύψος ενός AVL δέντρου -1 F l F r -2 F F-1 F- 2 1 F 0 1 F 1 2 F 1 1 1 5 2 5 k 2-1 5 1-2 5 2
1.44 log 2 F ή 1.44 log2n Επομένως οι αλγόριθμοι για την επεξεργασία των AVL δέντρων απαιτούν το πολύ 44% περισσότερο χρόνο από το βέλτιστο. Στην πράξη όμως έχει βρεθεί ότι ο χρόνος αυτός είναι πολύ λιγότερος.