AVL δέντρα AVL Δέντρα L R G.M. AdelsonVelkii και E.M. Landis 192 Μη AVL Δέντρα Εισαγωγή κόμβου, : : Αριστερή στροφή 1
8, 1 : 8 1 7 : 7 8 1 Δεξιά στροφή 8 7 Αριστερή στροφή 1 8 7 1 Περιπτώσεις LL : ο νέος κόμβος Υ εισάγεται στο αριστερό υποδέντρο του αριστερού υποδέντρου του Α. LR : ο νέος κόμβος Υ εισάγεται στο δεξί υποδέντρο του αριστερού υποδέντρου του Α. RR : ο νέος κόμβος Υ εισάγεται στο δεξί υποδέντρο του δεξιού υποδέντρου του Α. RL : ο νέος κόμβος Υ εισάγεται στο αριστερό υποδέντρο του δεξιού υποδέντρου του Α. Περίπτωση 1 (RR) : Δεξιά Υψηλό. Τ 2 Τ 3 Αριστερή στροφή x. osoinos 1 2 +1 3.. Τ 2. osoinos x Τ 3 +1 Συνολικό ύψος = +3 νέος Συνολικό ύψος = +2 2
tyedef enum{true, FALSE; tyedef enum{ay, IY, DY aagonisozygisis; tyedef stuct tyoskomvou *tyosdeikti; tyedef stuct tyoskomvou{ tyosstoixeiou dedomena; tyosdeikti aaidi, daidi; aagonisozygisis i; tyoskomvou; void aisteieistofi (tyosdeikti *);{ /*Ο δείχνει τη ρίζα του υποδέντρου που περιστρέφεται*/ tyosdeikti osoinos; if (kenodento(*)) /*Είναι αδύνατη η περιστροφή*/ intf( Κενό δέντρο ) /*ενός κενού δέντρου*/ else if (kenodento((*)->daidi)) /*Είναι αδύνατο να γίνει ρίζα ένα κενό υποδέντρο*/ intf ( Κενό δεξί υποδέντρο ) else{ osoinos = (*)->daidi; (*)->daidi = osoinos->aaidi; osoinos->aaidi =* ; * = osoinos; /*aisteieistofi*/ Περίπτωση 2 (RL):Αριστερά Υψηλό 2 w w 1 x - 1 ή Τ 2 νέος ή Τ - 1 3 Τ ή νέος Ενα από τα Τ 2 ή Τ 3 έχει ύψος..συνολικό ύψος = +3 Τ 2.Συνολικό ύψος = +3-1 Τ 3 Τ 3
w x παλιό w νέο νέο x Τ 2 Τ 3 Τ.Συνολικό ύψος = +2 Αποκατάσταση ισοζύγισης (διπλή RLπεριστροφή). Οι αριθμοί στους κύκλους δηλώνουν την προτεραιότητα των ενεργειών. H αποκατάσταση της ισοζύγισης με τις RR και RL περιστροφές υλοποιείται με το παρακάτω υποπρόγραμμα. void dexivaos(tyosdeikti *iza,boolean *ysiloteo){ tyosdeikti x; //δείκτης στο δεξί υποδέντρο της ρίζας tyosdeikti w; x = (*iza)->daidi; switc (x->i){ case DY: //απλή RR περιστροφή (*iza)->i = IY; x->i = IY; aisteieistofi(iza); *ysiloteo = FALSE; case IY: /*Δεν συμβαίνει η περίπτωση αυτή*/ intf ( Λάθος ); case AY:/*διπλή RL περιστροφή*/ w = x->aaidi; switc (w->i){ case IY: (*iza)->i=iy; x->i= IY; case AY: (*iza)->i=iy; x->i= DY; case DY: (*iza)->i=ay; x->i= IY; w->i=iy; dexiaeistofi(&x); /*o x δείχνει τώρα τον w*/ (*iza)->daidi = x; aisteieistofi(iza); ysiloteo = FALSE; // of switc /*dexivaos*/
Tο υποπρόγραμμα εισαγωγής ενός κόμβου σε ένα AVL δέντρο είναι το ακόλουθο : void avleisagogi (tyosdeikti *iza, tyosdeikti osoinos, tyosdeikti stoixeio, boolean *ysiloteo) { if (kenodento(*iza)){ *iza = osoinos; (*iza)->aaidi = NULL; (*iza)->daidi = NULL; (*iza)->i = IY; *ysiloteo = TRUE; else if (osoinos->dedomena==(*iza)->dedomena) intf( Ο κόμβος υπάρχει ήδη στο ΔΔΑ ); else if (osoinos->dedomena<(*iza)->dedomena){ /*εισαγωγή στο αριστερό υποδέντρο*/ avleisagogi(&((*iza)->aaidi)), osoinos, stoixeio, ysiloteo); if (*ysiloteo) switc ((*iza)->i){ case AY: aisteovaos(iza, ysiloteo); case IY: (*iza)->i=ay; *ysiloteo=true; case DY: (*iza)->i=iy; *ysiloteo=false; else{/*εισαγωγή στο δεξί υποδέντρο*/ avleisagogi (&((*iza)->daidi), osoinos, stoixeio, ysiloteo); if (*ysiloteo) switc ((*iza)->i){ case AY: (*iza)->i=iy; *ysiloteo=false; case IY: (*iza)->i=dy; *ysiloteo=true; case DY: dexivaos(iza, ysiloteo); /*avleisagogi*/ 5
Διαγραφή Αμετάβλητο ύψος Αμετάβλητο ύψος Τ1 Τ1-1 Τ1 Περίπτωση 1-1 Τ1 Τ3 Τ3 Ελαττωμένο ύψος Περίπτωση 3a Τ1 Τ1 Περίπτωση 2-1 Τ1-1 -1 Τ1 Τ3 Τ3 Ελαττωμένο ύψος -1 Τ1 Αμετάβλητο ύψος -1-1 -1 ή Τ3-1 -1-2 ή Τ3 Τ Τ1 Τ -2 Περίπτωση 3b Περίπτωση 3c Σχήμα 8.22 Διάφορες περιπτώσεις διαγραφής κόμβου από ένα AVL δέντρο.
Το ύψος ενός AVL δέντρου -1 ή F -2 F l Επομένως οι αλγόριθμοι για την επεξεργασία των AVL δέντρων απαιτούν το πολύ % περισσότερο χρόνο από το βέλτιστο. Στην πράξη όμως έχει βρεθεί ότι ο χρόνος αυτός είναι πολύ λιγότερος. 7