EPL231 – Data Structures and Algorithms Lab 6: AVL Trees EPL231 – Data Structures and Algorithms 23/10/2009
AVL Δέντρα AVL δέντρο: Χρόνοι: Είναι Δυαδικό Δέντρο Αναζήτησης Τα υποδέντρα ενός οποιουδήποτε κόμβου έχουν ύψος το οποίο διαφέρει το πολύ κατά ένα Χρόνοι: Εισαγωγή Διαγραφή Αναζήτηση 23/10/2009
Παραδείγματα AVL Δέντρων 2 2 1 3 4 2 3 4 2 1 2 1 3 23/10/2009
Παραδείγματα Εκτέλεσης 23/10/2009
Παράδειγμα Εισαγωγή των στοιχείων {72, 26, 9} Εισαγωγή 72: ΠΕΡΙΣΤΡΟΦΗ Εισαγωγή 26: 72 ΑΝΙΣΟΖΥΓΙΑ Εισαγωγή 9: 26 9 23/10/2009
Αριστερή Περιστροφή Πριν την εισαγωγή: τα δένδρα R, S, T έχουν το ίδιο ύψος, h. Μετά την εισαγωγή: έστω ότι ο κόμβος εισάγεται στο δένδρο R με αποτέλεσμα το ύψος του να γίνει h+1. Η αριστερή περιστροφή υλοποιεί το εξής: Α B A περιστροφή Β C A h+1 h C h+1 h T h R h h R S S T 23/10/2009
Διαδικασία Α-περιστροφής Αριστερή περιστροφή του (A,B) σημαίνει Α.left = Β.right Β.right = Α Α.height = C.height+1 Β.height = C.height + 2 Πριν την περιστροφή ο Α ήταν ο πατέρας του Β, και μετά, ο Β είναι ο πατέρας του Α. Το δένδρο παραμένει δυαδικό δένδρο αναζήτησης: Κάθε τιμή του Υ είναι μικρότερη από την τιμή του u, η τιμή του u είναι μεγαλύτερη από την τιμή του v. Μετά την περιστροφή το δένδρο είναι AVL: Α.height = h + 1 = ύψος του R. 23/10/2009
Παράδειγμα Α-περιστροφής 50 42 5 46 43 Α-ΠΕΡΙΣΤΡΟΦΗ ΑΝΙΣΟΖΥΓΙΑ 72 99 61 58 51 65 23/10/2009
Δεξιά Περιστροφή Συμμετρική ως προς την αριστερή περιστροφή. Συμμετρική ως προς την αριστερή περιστροφή. Πριν την εισαγωγή: τα δένδρα R, S, T έχουν το ίδιο ύψος, h. Μετά την εισαγωγή: έστω ότι ο κόμβος εισάγεται στο δένδρο Τ με αποτέλεσμα το ύψος του Τ να γίνει h+1. Α C Β C Δ περιστροφή A h h+1 B R h h+1 T S h h+1 R S T 23/10/2009
Διαδικασία Δ-περιστροφής Δεξιά περιστροφή του (A,C) σημαίνει Α.right = C.left C.left = Α Α.height = B.height+1 C.height = B.height + 2 Πριν την περιστροφή ο Α ήταν ο πατέρας του C, και μετά, ο C είναι ο πατέρας του Α. Το δένδρο παραμένει δυαδικό δένδρο αναζήτησης. 23/10/2009
ΑΔ-Περιστροφή Τα δένδρα Χ και W έχουν ύψος h. Μετά από κάποια εισαγωγή, το w έχει ύψος h+1, προκαλώντας ανισοζυγία στο u. u w AΔ περιστροφή v h v u W h+1 h+1 h w X Y Z W X h+1 h Y Z 23/10/2009
Παράδειγμα ΑΔ-περιστροφής Με την εισαγωγή των στοιχείων 72, 26, 9, 2, 21, 25 σε ένα ΑVL-δένδρο, δημιουργείται ανισοζυγία στον κόμβο 26. Με εφαρμογή ΑΔ περιστροφής έχουμε: ΑΔ ΠΕΡΙΣΤΡΟΦΗ ΑΝΙΣΟΖΥΓΙΑ 26 9 72 2 21 25 23/10/2009
ΔA-Περιστροφή Τα δένδρα Χ και W έχουν ύψος h. Μετά από κάποια εισαγωγή, το w έχει ύψος h+1, προκαλώντας ανισοζυγία στο u. u w ΔΑ περιστροφή u v h v X h+1 h+1 X Y Z W w h W h h+1 Y Z 23/10/2009
Παράδειγμα ΔΑ περιστροφής 4 ΔΑ ΠΕΡΙΣΤΡΟΦΗ ΑΝΙΣΟΖΥΓΙΑ 2 6 1 5 3 14 7 15 13 23/10/2009
Διαδικασίες ΑΔ και ΔΑ-περιστροφής Διαδικασίες ΑΔ και ΔΑ-περιστροφής ΑΔ περιστροφή του (u,v,w) υλοποιείται ως εξής: v.right = w.left, u.left = w.right, w.left = v, w.right = u, v.height, u.height, w.height = … ΔΑ περιστροφή του (u,v,w) υλοποιείται ως εξής: v.left = w.right, u.right = w.left, w.left = u, w.right = v, και v.height, u.height, w.height = …. H περιστροφές δεν παραβιάζουν τη ΔΔΑ συνθήκη. Το δένδρο που δημιουργείται είναι AVL-δένδρο (οι κόμβοι v και u έχουν ύψος h+1). 23/10/2009
Πως αποφασίζουμε το είδος της περιστροφής Στην θεωρία είναι εύκολο. Βλέπουμε τις κατευθύνσεις που ακολουθήσαμε για να εισάξουμε τον κόμβο Ανάλογα με τις κατευθύνσεις, επιλέγουμε το είδος της περιστροφής. Τι γίνεται τώρα που πρέπει να γράψουμε κώδικα? 23/10/2009
Πως αποφασίζουμε το είδος της περιστροφής Περιστροφή αριστερά: Κάναμε εισαγωγή αριστερά δύο φορές Αριστερή Περιστροφή singleRotationLeft() Κάναμε εισαγωγή αριστερά και μετά δεξία ΑΔ περιστροφήdoubleRotationLeftRight() Περιστροφή δεξιά: Κάναμε εισαγωγή δεξιά δύο φορές Δεξιά ΠεριστροφήsingleRotationRight() Κάναμε εισαγωγή δεξιά και μετά αριστερά ΔΑ περιστροφήdoubleRotationRightLeft() 23/10/2009
Δομές – Συναρτήσεις Βρίσκονται στα αρχεία Συμπληρώστε την: Υλοποίηστε: AVLTree.h AVLTree.cpp Συμπληρώστε την: insertNode() Υλοποίηστε: singleRotationLeft() singleRotationRight() doubleRotationLeftRight() doubleRotationRightLeft() 23/10/2009
The End 23/10/2009