Δομές Δεδομένων και Αλγόριθμοι

Σχετικά έγγραφα
Δομές Δεδομένων και Αλγόριθμοι (Γ εξάμηνο) Τμήμα Μηχανικών Πληροφορικής ΤΕ, ΤΕΙ Ηπείρου. Άσκηση εργαστηρίου #6 (Υλοποίηση δυαδικού δένδρου αναζήτησης)

Red-Black Δέντρα. Red-Black Δέντρα

Δομές Δεδομένων Ενότητα 5

Δομές Δεδομένων (Data Structures)

Δένδρα. Μαθηματικά (συνδυαστικά) αντικείμενα. Έχουν κεντρικό ρόλο στην επιστήμη των υπολογιστών :

Πανεπιστήμιο Πειραιώς Σχολή Τεχνολογιών Πληροφορικής και Επικοινωνιών Τμήμα Ψηφιακών Συστημάτων ομές εδομένων

Δομές Δεδομένων & Αλγόριθμοι

Διδάσκων: Κωνσταντίνος Κώστα

Μάθημα 22: Δυαδικά δέντρα (Binary Trees)

AVL-trees C++ implementation

Δυαδικά Δένδρα Αναζήτησης, Δένδρα AVL

Διδάσκων: Παναγιώτης Ανδρέου

Διάλεξη 11: Δέντρα Ι Εισαγωγή σε Δενδρικές Δομές Δεδομένων

Διάλεξη 17: Δυαδικά Δέντρα. Διδάσκων: Κωνσταντίνος Κώστα Διαφάνειες: Δημήτρης Ζεϊναλιπούρ

Προγραμματισμός Ι (ΗΥ120)

οµές εδοµένων 3 ο Εξάµηνο ΕΝΟΤΗΤΑ 4 ΕΝ ΡΑ

Διάλεξη 12: Δέντρα ΙΙ Δυαδικά Δέντρα

Διάλεξη 11: Δέντρα Ι - Εισαγωγή σε Δενδρικές Δομές Δεδομένων

Δένδρα. Στην ενότητα αυτή θα μελετηθούν τα εξής επιμέρους θέματα:

ιαφάνειες παρουσίασης #10 (β)

Ισορροπημένα Δένδρα. για κάθε λειτουργία; Ισορροπημένο δένδρο : Διατηρεί ύψος κάθε εισαγωγή ή διαγραφή

ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ. Βασικές Ιδιότητες και Διάσχιση Κεφάλαιο 5 ( και ) Ε. Μαρκάκης Επίκουρος Καθηγητής

Ενότητες 3 & 4: Δένδρα, Σύνολα & Λεξικά Ασκήσεις και Λύσεις

Δομές Δεδομένων και Αλγόριθμοι

Διάλεξη 22: Δυαδικά Δέντρα. Διδάσκων: Παναγιώτης Ανδρέου

ΔυαδικάΔΕΝΔΡΑΑναζήτησης

Γράφημα. Συνδυαστικό αντικείμενο που αποτελείται από 2 σύνολα: Σύνολο κορυφών (vertex set) Σύνολο ακμών (edge set) 4 5 πλήθος κορυφών πλήθος ακμών

Δομές Δεδομένων. Δημήτρης Μιχαήλ. Δέντρα Αναζήτησης. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Διδάσκων: Παναγιώτης Ανδρέου

Δομές Δεδομένων. Καθηγήτρια Μαρία Σατρατζέμη. Τμήμα Εφαρμοσμένης Πληροφορικής. Δομές Δεδομένων. Τμήμα Εφαρμοσμένης Πληροφορικής

ΑΛΓΟΡΙΘΜΟΙ ΜΕ C. ΝΙΚΟΛΑΟΣ ΣΑΜΑΡΑΣ Αναπληρωτής Καθηγητής. CMOR Lab. Computational Methodologies and Operations Research

ΠΛΗ111. Ανοιξη Μάθηµα 7 ο. έντρο. Τµήµα Ηλεκτρονικών Μηχανικών και Μηχανικών Υπολογιστών Πολυτεχνείο Κρήτης

Εκτενείς Δομές Δεδομένων

Δομές Δεδομένων (Εργ.) Ακ. Έτος Διδάσκων: Ευάγγελος Σπύρου. Εργαστήριο 10 Δυαδικά Δένδρα Αναζήτησης

Ισορροπημένα Δένδρα. για κάθε λειτουργία; Ισορροπημένο δένδρο : Διατηρεί ύψος κάθε εισαγωγή ή διαγραφή

Διάλεξη 13: Δέντρα ΙΙΙ - Ισοζυγισμένα Δέντρα, AVL Δέντρα

Δηµοσθένης Σταµάτης Τµήµα Πληροφορικής ΑΤΕΙ ΘΕΣΣΑΛΟΝΙΚΗΣ ΔΕΝΤΡΑ (TREES) B C D E F G H I J K L M

Δομές Δεδομένων και Αλγόριθμοι

ένδρα (tail, head) Γονέας Παιδί (ancestor, descendant) Φύλλο Εσωτερικός Κόµβος (leaf, non-leaf) που αποτελεί το γονέα του v.

Δένδρα Αναζήτησης Πολλαπλής Διακλάδωσης

Δομές δεδομένων. Ενότητα 5η: Υλοποίηση Λεξικών με Ισοζυγισμένα Δένδρα Παναγιώτα Φατούρου Τμήμα Επιστήμης Υπολογιστών

Διασυνδεδεμένες Δομές. Δυαδικά Δέντρα. Προγραμματισμός II 1

ένδρα u o Κόµβοι (nodes) o Ακµές (edges) o Ουρά και κεφαλή ακµής (tail, head) o Γονέας Παιδί Αδελφικός κόµβος (parent, child, sibling) o Μονοπάτι (pat

Εκτενείς Δομές Δεδομένων

Αλγόριθμοι και Δομές Δεδομένων (IΙ) (γράφοι και δένδρα)

ΕΝΟΤΗΤΑ 5 ΥΝΑΜΙΚΑ ΛΕΞΙΚΑ ΙΣΟΖΥΓΙΣΜΕΝΑ ΕΝ ΡΑ

ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΡΗΤΗΣ

Δομές Αναζήτησης. κλειδί από ολικά διατεταγμένο σύνολο. Θέλουμε να υποστηρίξουμε δύο βασικές λειτουργίες: Εισαγωγή ενός νέου στοιχείου

9. Κόκκινα-Μαύρα Δέντρα

ΟΙΚΟΝΟΜΙΚΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΑΘΗΝΩΝ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ. Δοµές Δεδοµένων

ΗΥ240 - Παναγιώτα Φατούρου 1

Δομές Δεδομένων και Αλγόριθμοι

Διάλεξη 16: Σωροί. Στην ενότητα αυτή θα μελετηθούν τα εξής επιμέρους θέματα: - Ουρές Προτεραιότητας - Ο ΑΤΔ Σωρός, Υλοποίηση και πράξεις

ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ EPL035: ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ ΚΑΙ ΑΛΓΟΡΙΘΜΟΙ

Κατ οίκον Εργασία 3 Σκελετοί Λύσεων

ΕΝΟΤΗΤΑ 4 ΕΝ ΡΑ. ΗΥ240 - Παναγιώτα Φατούρου 1

ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΡΗΤΗΣ. Δομές δεδομένων. Ενότητα 3η: Δένδρα Παναγιώτα Φατούρου Τμήμα Επιστήμης Υπολογιστών

Διάλεξη 13: Δέντρα ΙΙΙ Ισοζυγισμένα Δέντρα, AVL Δέντρα

Ισοζυγισµένο έντρο (AVL Tree)

Δομές Δεδομένων. Δημήτρης Μιχαήλ. Δέντρα Αναζήτησης. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Διάλεξη 13: Δέντρα ΙΙΙ Ισοζυγισμένα Δέντρα, AVL Δέντρα. Διδάσκων: Παναγιώτης Ανδρέου

έντρα ομές εδομένων 3ο εξάμηνο ιδάσκων: Χρήστος ουλκερίδης ιαφάνειες προσαρμοσμένες από το υλικό της Μαρίας Χαλκίδη

Ισορροπημένα Δένδρα. για κάθε λειτουργία; Ισορροπημένο δένδρο : Διατηρεί ύψος κάθε εισαγωγή ή διαγραφή

ιαφάνειες παρουσίασης #11

Δοµές Δεδοµένων. 11η Διάλεξη Ταξινόµηση Quicksort και Ιδιότητες Δέντρων. Ε. Μαρκάκης

Γέφυρες σε Δίκτυα. Μας δίνεται ένα δίκτυο (κατευθυνόμενο γράφημα) αφετηριακός κόμβος. Γέφυρα του (με αφετηρία τον ) :

Πανεπιστήμιο Δυτικής Μακεδονίας. Τμήμα Μηχανικών Πληροφορικής & Τηλεπικοινωνιών. Διακριτά Μαθηματικά. Ενότητα 3: Δένδρα

ΣΧΟΛΗ ΔΙΟΙΚΗΣΗΣ ΚΑΙ ΟΙΚΟΝΟΜΙΑΣ ΤΜΗΜΑ ΔΙΟΙΚΗΣΗΣ ΕΠΙΧΕΙΡΗΣΕΩΝ (ΠΑΤΡΑ) ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ

Δομές Δεδομένων και Αλγόριθμοι

Διάλεξη 18: B-Δένδρα

ΑΝΩΤΑΤΟ ΤΕΧΝΟΛΟΓΙΚΟ ΕΚΠΑΙΔΕΥΤΙΚΟ ΙΔΡΥΜΑ ΚΑΛΑΜΑΤΑΣ ΠΑΡΑΡΤΗΜΑ ΣΠΑΡΤΗΣ ΤΜΗΜΑ ΤΕΧΝΟΛΟΓΙΑΣ ΠΛΗΡΟΦΟΡΙΚΗΣ ΚΑΙ ΤΗΛΕΠΙΚΟΙΝΩΝΙΩΝ

ΗΥ360 Αρχεία και Βάσεις εδοµένων

Δομές Αναζήτησης. κλειδί από ολικά διατεταγμένο σύνολο. Θέλουμε να υποστηρίξουμε δύο βασικές λειτουργίες: Εισαγωγή ενός νέου στοιχείου

Ισοζυγισμένα υαδικά έντρα Αναζήτησης

Κατ οίκον Εργασία 3 Σκελετοί Λύσεων

Διάλεξη 26: Σωροί. Διδάσκων: Παναγιώτης Ανδρέου

Οι βασικές πράξεις που ορίζουν τον ΑΤ δυαδικό δέντρο αναζήτησης είναι οι ακόλουθες:

Εισαγωγή ενός νέου στοιχείου. Επιλογή i-οστoύ στοιχείου : Εύρεση στοιχείου με το i-οστό μικρότερο κλειδί

Διάλεξη 16: Σωροί. Στην ενότητα αυτή θα μελετηθούν τα εξής επιμέρους θέματα: - Ουρές Προτεραιότητας - Ο ΑΤΔ Σωρός, Υλοποίηση και πράξεις

Δομές Δεδομένων. Δημήτρης Μιχαήλ. Ουρές Προτεραιότητας. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Κεφάλαιο 10 Ψηφιακά Λεξικά

Δυαδικά Δέντρα Αναζήτησης (Binary Search Trees) Ορισμός : Ένα δυαδικό δέντρο αναζήτησης t είναι ένα δυαδικό δέντρο, το οποίο είτε είναι κενό είτε:

Ενότητα 9 Ξένα Σύνολα που υποστηρίζουν τη λειτουργία της Ένωσης (Union-Find)

Διάλεξη 14: Δέντρα IV - B-Δένδρα

ΟιβασικέςπράξειςπουορίζουντονΑΤΔ δυαδικό δέντρο αναζήτησης είναι οι ακόλουθες:

Ενότητα 7 Ουρές Προτεραιότητας

Συγκρίσιμα Αντικείμενα (comparable)

h/2. Άρα, n 2 h/2-1 h 2log(n+1). Πως υλοποιούµε τη LookUp()? Πολυπλοκότητα?

ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ. ΑΣΚΗΣΗ 3 Δέντρα

Διδάσκων: Παναγιώτης Ανδρέου

Κεφάλαιο 8 Ισορροπημένα Δένδρα Αναζήτησης

Ενότητα 9 Ξένα Σύνολα που υποστηρίζουν τη λειτουργία της Ένωσης (Union-Find)

Μπαλτάς Αλέξανδρος 21 Απριλίου 2015

Εργαστήριο 5 Αναδρομική διεργασία εισαγωγής καινούριου κόμβου σε ΔΔΑ με αλφαβητική σειρά

Δομές Δεδομένων. Ενότητα 10: Πλήρη Δυαδικά Δέντρα, Μέγιστα/Ελάχιστα Δέντρα & Εισαγωγή στο Σωρό- Ο ΑΤΔ Μέγιστος Σωρός. Καθηγήτρια Μαρία Σατρατζέμη

Θέματα Υπολογισμού στον Πολιτισμό - Δένδρα. Δένδρα

ΕΝΟΤΗΤΑ 4 ΣΥΝΟΛΑ - ΛΕΞΙΚΑ

Διάλεξη 14: Δέντρα IV B Δένδρα. Διδάσκων: Παναγιώτης Ανδρέου

Δέντρα (Trees) - Ιεραρχική Δομή

Διασυνδεδεμένες Δομές. Λίστες. Προγραμματισμός II 1

Transcript:

Δομές Δεδομένων και Αλγόριθμοι Χρήστος Γκόγκος ΤΕΙ Ηπείρου Χειμερινό Εξάμηνο 2014-2015 Παρουσίαση 16 Δένδρα (Trees) 1 / 42

Δένδρα (Trees) Ένα δένδρο είναι ένα συνδεδεμένο γράφημα χωρίς κύκλους Για κάθε 2 κόμβους ενός δένδρου υπάρχει ακριβώς 1 διαδρομή που οδηγεί από τον ένα κόμβο στον άλλο Το πλήθος των ακμών ενός δένδρου είναι κατά ένα μικρότερο από το πλήθος των κόμβων του (δηλαδή ισχύει ότι E = V 1) 2 / 42

Όροι που χρησιμοποιούνται σε δένδρα Ρίζα (root) Υποδένδρα (subtrees) Γονέας (parent) Παιδί (child) Φύλλο (leaf) Πρόγονοι (ancestors) Απόγονοι (descendants) Αδέλφια (siblings) Το ύψος (height) ενός δένδρου είναι το μήκος του μακρύτερου μονοπατιού από τη ρίζα προς ένα φύλλο του δένδρου Το βάθος ενός κόμβου είναι το μήκος του μονοπατιού από τη ρίζα προς τον κόμβο Για το παραπάνω δένδρο Ρίζα είναι το a, το d είναι γονέας των παιδιών h και i που είναι και φύλλα Το b είναι πρόγονος του j Το k είναι απόγονος του b Τα b και d είναι αδέλφια Το ύψος του δένδρου είναι 3 και το βάθος του e είναι 2 3 / 42

Εφαρμογές δένδρων 1 Περιγραφή ιεραρχιών 2 Υλοποίηση λεξικών (dictionaries): Ένα λεξικό περιέχει ζεύγη key, value 3 Αποδοτική αποθήκευση μεγάλου όγκου δεδομένων 4 Κωδικοποίηση δεδομένων (πχ κωδικοποίηση Huffman) 4 / 42

Διατεταγμένα δένδρα Στα διατεταγμένα δένδρα (ordered trees) τα παιδιά κάθε κορυφής είναι διατεταγμένα από αριστερά προς τα δεξιά Δυαδικά δένδρα (Binary Trees) Κάθε κόμβος έχει το πολύ 2 παιδιά Δυαδικά δένδρα αναζήτησης (Binary Search Trees) Δυαδικά δένδρα για τα οποία ισχύει ότι το αριστερό παιδί έχει μικρότερο κλειδί από το γονέα και το δεξιό παιδί έχει μεγαλύτερο κλειδί από το γονέα Δένδρα πολλαπλών δρόμων Κάθε κόμβος μπορεί να έχει κανένα ένα ή περισσότερα παιδιά 5 / 42

Μετατροπή ενός δένδρου πολλαπλών δρόμων σε δυαδικό δένδρο first child-next sibling Με δεδομένο ένα δένδρο πολλαπλών δρόμων μπορεί να κατασκευαστεί ένα ισοδύναμο δυαδικό δένδρο ακολουθώντας την ακόλουθη διαδικασία που είναι γνωστή ως first child next sibling Για κάθε κόμβο x με παιδιά του δένδρου πολλαπλών δρόμων: 1 Ο κόμβος x εισάγεται στο δυαδικό δένδρο 2 Το παιδί του x που βρίσκεται αριστερότερα γίνεται το αριστερό παιδί του κόμβου x στο δυαδικό δένδρο 3 Κάθε παιδί του x που ακολουθεί γίνεται δεξί παιδί του πλησιέστερου αδερφού του που έχει ήδη τοποθετηθεί στο δυαδικό δένδρο 6 / 42

To δυαδικό δένδρο που προκύπτει από το προηγούμενο δένδρο πολλαπλών δρόμων 7 / 42

Όρια για το ύψος ενός δυαδικού δένδρου Το ύψος (height) ενός δυαδικού δένδρου είναι: log 2 n height n 1 όπου n είναι ο αριθμός των κόμβων του δένδρου 8 / 42

Πλήρες δυαδικό δένδρο - συμπληρωμένο δυαδικό δένδρο Πλήρες δυαδικο δένδρο Είναι ένα δυαδικό δένδρο για το οποίο όλοι οι κόμβοι (πλην των φύλλων) έχουν 2 παιδιά Συμπληρωμένο δυαδικο δένδρο Είναι ένα δυαδικό δένδρο που προκύπτει από το πλήρες δένδρο διαγράφοντας κόμβους διανύοντας το δένδρο από κάτω προς τα πάνω και από δεξιά προς τα αριστερά 9 / 42

Υλοποίηση δυαδικού δένδρου Στατική αναπαράσταση δυαδικού δένδρου (με χρήση πίνακα) Έχει το μειονέκτημα ότι μπορεί πολλές θέσεις του πίνακα να είναι κενές Συνδεδεμένη αναπαράσταση δυαδικού δένδρου Κάθε κόμβος αποτελείται από ένα κλειδί και 2 δείκτες που δείχνουν στο αριστερό και στο δεξιό υποδένδρο του Εναλλακτικά μπορεί να υπάρχει και τρίτος δείκτης ο οποίος δέχνει στο γονέα του κάθε κόμβου 10 / 42

Συνδεδεμένη αναπαράσταση δυαδικού δένδρου struct node { int key; struct node* left ; struct node* right ; }; struct node* new_node(int key) { struct node* node = new (struct node); node >key = key; node >left = NULL; node >right = NULL; return (node); } 11 / 42

Διάσχιση δυαδικού δένδρου Προδιατεταγμένη (preorder) Ενδοδιατεταγμένη (inorder) Μεταδιατεταγμένη (postorder) Κατά σειρά επιπέδων (levelorder) Στην προδιατεταγμένη, ενδοδιατεταγμένη και μεταδιατεταγμένη διάσχιση διανύονται πρώτα οι κόμβοι του αριστερού υποδένδρου και μετά οι κόμβοι του δεξιού υποδένδρου 12 / 42

Προδιατεταγμένη (preorder) διάσχιση δένδρου void preorder_traversal( struct node* node) { if (node == NULL) return ; printf ( %d, node >key); preorder_traversal(node >left); preorder_traversal(node >right); } Έξοδος 20, 13, 7, 9, 8, 10, 14, 25, 22, 35 13 / 42

Ενδοδιατεταγμένη (inorder) διάσχιση δένδρου void inorder_traversal ( struct node* node) { if (node == NULL) return ; inorder_traversal (node >left); printf ( %d, node >key); inorder_traversal (node >right); } Έξοδος 7, 8, 9, 10, 13, 14, 20, 22, 25, 35 14 / 42

Μεταδιατεταγμένη (postorder) διάσχιση δένδρου void postorder_traversal( struct node* node) { if (node == NULL) return ; postorder_traversal(node >left); postorder_traversal(node >right); printf ( %d, node >key); } Έξοδος 8, 10, 9, 7, 14, 13, 22, 35, 25, 20 15 / 42

Διάσχιση δένδρου κατά σειρά επιπέδων (levelorder) #include <queue> void levelorder_traversal ( struct node* node) { queue<struct node*> q; qpush(node); while (! qempty()) { struct node* tmp = qfront () ; printf ( %d, tmp >key); if (tmp >left!= NULL) qpush(tmp >left); if (tmp >right!= NULL) qpush(tmp >right); qpop(); } } Έξοδος 20, 13, 25, 7, 14, 22, 35, 9, 8, 10 16 / 42

Τυπικές λειτουργίες δυαδικού δένδρου Εύρεση ύψους του δένδρου Υπολογισμός αριθμού κόμβων του δένδρου Αντιγραφή του δένδρου Παρουσίαση του δένδρου σε μονάδα εξόδου Οι παραπάνω ενέργειες μπορούν να πραγματοποιηθούν χρησιμοποιώντας έναν από τους τρόπους διάσχισης του δένδρου: preorder, inorder, postorder και levelorder 17 / 42

Δυαδικά δένδρα αναζήτησης (Binary Search Trees) BST Σε ένα δυαδικό δένδρο αναζήτησης: Κάθε κόμβος έχει διαφορετικό (διακριτό) κλειδί σε σχέση με τους υπόλοιπους κόμβους του δένδρου Tα κλειδία που είναι στο αριστερό υποδένδρο ενός κόμβου είναι μικροτερα από το κλειδί του κόμβου και τα κλειδία που είναι στο δεξί υποδένδρο είναι μεγαλύτερα από το κλειδί του κόμβου Κάθε υποδένδρο ενός δυαδικού δένδρου αναζήτησης είναι και αυτό δυαδικό δένδρο αναζήτησης Ένα δυαδικό δένδρο αναζήτησης έχει παρόμοιες αποδόσεις με ένα ταξινομημένο πίνακα για λειτουργίες όπως η αναζήτηση και επιπλέον επιτυγχάνει γρήγορες εισαγωγές νέων στοιχείων και διαγραφές υπαρχόντων στοιχείων 18 / 42

Αναζήτηση σε δυαδικό δένδρο αναζήτησης Εκκίνηση στη ρίζα Σε κάθε κόμβο εξέταση της τιμής κλειδιού σε σχέση με αυτή που αναζητείται και επιλογή του αριστερού ή του δεξιού υποδένδρου για συνέχεια Η διαδικασία τερματίζει όταν βρεθεί το στοιχείο ή όταν φτάσουμε σε NULL struct node* find( struct node* node, int key) { if (node == NULL) { return (NULL); } else { if (key == node >key) return (node); else if (key < node >key) return ( find (node >left, key)); else return ( find (node >right, key)); } } 19 / 42

Εισαγωγή νέου κλειδιού Κ σε δυαδικό δένδρο αναζήτησης Αναζήτηση για το κλειδί Κ Αν το κλειδί δε βρεθεί τότε ο τελευταίος δείκτης που διανύθηκε προκειμένου να φτάσουμε στο NULL αλλάζει έτσι ώστε πλέον να δείχνει στο Κ struct node* insert_node(struct node* node, int key) { if (node == NULL) { return (new_node(key)); } else { if (key == node >key) { cerr << only distinct values are accepted! << endl; return node; } else if (key < node >key) node >left = insert_node(node >left, key); else node >right = insert_node(node >right, key); return (node); } } 20 / 42

Διαγραφή κλειδιού Κ από ένα δυαδικό δένδρο αναζήτησης Αναζήτηση για το κλειδί Κ Διακρίνονται στη συνέχεια 3 περιπτώσεις Αν το κλειδί Κ είναι φύλλο του δένδρου τότε απλά διαγράφεται Αν το κλειδί Κ είναι κόμβος του δένδρου με ένα μόνο υποδένδρο τότε διαγράφεται ο κόμβος και το υποδένδρο ανεβαίνει προς τα πάνω Αν το κλειδί Κ είναι κόμβος του δένδρου με δύο υποδένδρα τότε αντικαθιστούμε το κλειδί Κ είτε με το μεγαλύτερο στοιχείο του αριστερού υποδένδρου είτε με το μικρότερο στοιχείο του δεξιού υποδένδρου 21 / 42

Διαγραφή φύλλου (κλειδί 22) απλά διαγράφεται το κλειδί 22 22 / 42

Διαγραφή κόμβου με ένα μόνο υποδένδρο (κλειδί 7) το κλειδί 7 αντικαθίσταται από το κλειδί 9 και όλο το υποδένδρο κάτω από το 9 ανεβαίνει και αυτό προς τα πάνω 23 / 42

Διαγραφή κόμβου με δύο υποδένδρα (κλειδί 13) Το κλειδί 13 αντικαθίσταται από το μεγαλύτερο κλειδί του αριστερού υποδένδρου του (δλδ το 10) το οποίο και διαγράφεται Εναλλακτικά θα μπορούσε να αντικατασταθεί με το μικρότερο κλειδί του δεξιού υποδένδρου του (δλδ το 14) 24 / 42

Διαγραφή φύλλου από το δυαδικό δένδρο αναζήτησης void delete_node(struct node* tree, int key) { struct node* ptr = tree; struct node* parent = NULL;bool turn_left = false ; while ( ptr!= NULL && ptr >key!= key) { parent = ptr ; if (key < ptr >key) {turn_left = true ; ptr = ptr >left ;} else { turn_left = false ; ptr = ptr >right;}} if ( ptr == NULL) {cout << Value << key << not found << endl;} else if ( ptr >left == NULL && ptr >right == NULL) {// case 1: leaf if ( turn_left ) parent >left = NULL;else parent >right = NULL; delete ptr ; } else if ( ptr >left == NULL) {// case 2: single subtree if ( turn_left )parent >left = ptr >right; else parent >right = ptr >right; delete ptr ; } else if ( ptr >right == NULL) { if ( turn_left ) parent >left = ptr >left; else parent >right = ptr >left; delete ptr ; } else { // case 3: two subtrees Replace node to be deleted with // the largest value of its left subtree int max_value_left_subtree = max_value(ptr >left); struct node* tmp = ptr >left; while (tmp >right >key!= max_value_left_subtree) tmp = tmp >right; ptr >key = max_value_left_subtree;delete tmp >right; tmp >right = NULL;} } 25 / 42

Άλλες λειτουργίες σε δυαδικό δένδρο αναζήτησης Εύρεση μεγίστου - ελαχίστου Υπολογισμός ύψους δένδρου int max_value(struct node* node) { struct node* current = node; while (current >right!= NULL) { current = current >right; } return (current >key); } int height( struct node* node) { if (node == NULL) { return ( 1); } else { int l_height = height(node >left); int r_height = height(node >right); if (l_height > r_height) return (l_height + 1); else return (r_height + 1); } } 26 / 42

Δυαδικά δένδρα αναζήτησης με εγγύηση μέγιστου ύψους Ιδέα Οργάνωση των κόμβων ενός δυαδικού δένδρου αναζήτησης με τέτοιο τρόπο έτσι ώστε το ύψος του να είναι κοντά στο log 2 n όπου n είναι το πλήθος των κόμβων του δένδρου Έτσι λειτουργίες όπως η αναζήτηση, η εισαγωγή, η διαγραφή, η εύρεση μεγίστου κλπ εκτελούνται σε χρόνο O(log 2 n) Κόκκινα μαύρα δένδρα (Red Black Trees) AVL δένδρα 27 / 42

Κόκκινα Μαύρα Δένδρα Τα κόκκινα μαύρα δένδρα είναι δυαδικά δένδρα αναζήτησης για τα οποία ισχύουν κανόνες που έχουν να κάνουν με μια επιπλέον ιδιότητα χρώματος η οποία προσαρτάται σε κάθε κόμβο Προτάθηκαν από τον R Bayer το 1972 και τους L Guibas και R Sedgewick το 1978 Κάθε κόμβος μπορεί να είναι κόκκινος ή μαύρος Η ρίζα είναι μαύρη Δεν μπορεί να υπάρχουν δύο συνεχόμενοι κόκκινοι κόμβοι σε οποιαδήποτε διαδρομή από την κορυφή προς ένα φύλλο του δένδρου (δλδ κάθε κόκκινος κόμβος επιτρέπεται να έχει μόνο μαύρα παιδιά) Κάθε διαδρομή από τη ρίζα προς τα φύλλα έχει τον ίδιο αριθμό από μαύρους κόμβους http://cslmuedu/~ray/notes/redblacktrees/ 28 / 42

Ύψος κόκκινων μαύρων δένδρων Το ύψος ενός κόκκινου μαύρου δένδρου με n κόμβους είναι μικρότερο ή ίσο του 2 log 2 (n + 1) Κατά την εισαγωγή νέων κόμβων ή τη διαγραφή υπαρχόντων κόμβων θα πρέπει να διασφαλιστεί ότι το δένδρο εξακολουθεί να έχει τις ιδιότητες που πρέπει να ισχύουν για τα κόκκινα μαύρα δένδρα Για να επιτευχθεί αυτό πραγματοποιούνται περιστροφές (rotations) τμημάτων του δένδρου και επαναχρωματισμοί κόμβων Τα κόκκινα μαύρα δένδρα χρησιμοποιούνται σε διάφορες βιβλιοθήκες καθώς και στην STL της C++ για να υλοποιήσουν τα std::set και std::map #include <set> #include <map> set<int> a_set; a_setinsert (5) ; a_setinsert (7) ; a_setinsert (5) ; // already exists a_setinsert (3) ; a_setinsert (10); for ( int x : a_set) cout << x << ; cout << endl; // outputs: 3 5 7 10 map<string, string> agenta; agenta[ Christos ] = 12345 ; agenta[ Maria ] = 23456 ; agenta[ Petros ] = 34567 ; for ( pair<string, string> k_v : agenta) cout << k_v first << > << k_vsecond << endl; // outputs // Christos >12345 // Maria >23456 // Petros >34567 29 / 42

AVL δένδρα Προτάθηκαν από τους GMAdelson-Velsky και EM Landis το 1962 Η διαφορά στο ύψος του αριστερού και του δεξιού υποδένδρου δεν θα πρέπει να υπερβαίνει τη μονάδα ή ισοδύναμα η διαφορά στα ύψη του αριστερού με το δεξιό υποδένδρο μπορεί να είναι +1, 0 ή -1 (το ύψος του άδειου υποδένδρου ορίζεται ως -1) To ύψος h οποιουδήποτε AVL δένδρου με n κόμβους είναι: log 2 n h 14405 log 2 (n + 2) 13277 Αν η εισαγωγή ενός νέου κόμβου ή η διαγραφή ενός υπάρχοντος κόμβου κάνει το AVL δένδρο μη ισοζυγισμένο τότε το δένδρο θα πρέπει να επιδιορθωθεί με περιστροφές (rotations) τμημάτων του Οι περιστροφές μπορούν να γίνουν σε σταθερό χρόνο κατά μέσο όρο οπότε η χρήση των AVL δένδρων είναι αποδοτική 30 / 42

Σύγκριση AVL δένδρων και Red Black δένδρων Τα AVL δένδρα είναι αυστηρότερα ισοζυγισμένα (balanced) σε σχέση με τα Red Black δένδρα Αυτό οδηγεί σε πιο αργές εισαγωγές και διαγραφές αλλά ταχύτερες αναζητήσεις για τα AVL δένδρα σε σχέση με τα Red Black δένδρα 31 / 42

Περιστροφές (rotations) σε AVL δένδρα Παράγοντας ισορροπίας (bf = balance factor) Είναι η τιμή που προκύπτει αν αφαιρέσουμε από το ύψος του δεξιού υποδένδρου το ύψος του αριστερού υποδένδρου Αν το bf είναι 1 ή 0 ή -1 τότε ο κόμβος θεωρείται ισοζυγισμένος Αν αυτό ισχύει για όους τους κόμβους του δένδρου τότε το δένδρο είναι AVL Η περιστροφές αλλάζουν τη δομή του δένδρου χωρίς όμως να αλλάζουν τη σειρά των στοιχείων Ο σκοπός των περιστροφών είναι να μειώσουν το ύψος ενός υποδένδρου κατά 1 και να αυξήσουν το ύψος ενός άλλου υποδένδρου κατα 1 32 / 42

Είδη περιστροφών σε AVL δένδρα δεξιά περιστροφή (RR = Right Rotation) αριστερή περιστροφή (LR = Left Rotation) δεξιά και αριστερή περιστροφή (RLR = Right Left Rotation) αριστερή και δεξιά περιστροφή (LRR = Left Right Rotation) 33 / 42

Δεξιά περιστροφή σε AVL δένδρα Δεξιά περιστροφή To B γίνεται η νέα ρίζα του υποδένδρου To δεξί παιδί του Β γίνεται αριστερό παιδί του Α To A γίνεται δεξί παιδί του Β 34 / 42

Αριστερή περιστροφή σε AVL δένδρα Αριστερή περιστροφή To B γίνεται η νέα ρίζα του υποδένδρου To αριστερό παιδί του Β γίνεται δεξί παιδί του Α To A γίνεται αριστερό παιδί του Β 35 / 42

Αριστερή - δεξιά περιστροφή σε AVL δένδρα Αριστερή - δεξιά περιστροφή (LRR) Πρώτα γίνεται μια δεξιά περιστροφή στο κάτω μέρος του δένδρου και στη συνέχεια μια αριστερή περιστροφή στο πάνω μέρος του 36 / 42

Αριστερή - δεξιά περιστροφή σε AVL δένδρα 37 / 42

Δεξιά - αριστερή περιστροφή σε AVL δένδρα Δεξιά - αριστερή περιστροφή (RLR) Πρώτα γίνεται μια αριστερή περιστροφή στο κάτω μέρος του δένδρου και στη συνέχεια μια δεξιά περιστροφή στο πάνω μέρος του 38 / 42

Δεξιά - αριστερή περιστροφή σε AVL δένδρα 39 / 42

Παράδειγμα (1/3) Παράδειγμα σταδιακής εισαγωγής σε ένα AVL δένδρο των τιμών 50,30,70,20,10,25,28,27,26 Εισαγωγή των τιμών 50, 30, 70, 20 Εισαγωγή της τιμής 10 40 / 42

Παράδειγμα (2/3) Παράδειγμα σταδιακής εισαγωγής σε ένα AVL δένδρο των τιμών 50,30,70,20,10,25,28,27,26 Εισαγωγή της τιμής 25 Εισαγωγή της τιμής 28 41 / 42

Παράδειγμα (3/3) Παράδειγμα σταδιακής εισαγωγής σε ένα AVL δένδρο των τιμών 50,30,70,20,10,25,28,27,26 Εισαγωγή της τιμής 27 Εισαγωγή της τιμής 26 42 / 42