Πανεπιστήμιο Πειραιώς Σχολή Τεχνολογιών Πληροφορικής και Επικοινωνιών Τμήμα Ψηφιακών Συστημάτων 6. Δυαδικά Δέντρα 2 ομές εδομένων 4 5 Χρήστος ουλκερίδης Τμήμα Ψηφιακών Συστημάτων 18/11/2016
Εισαγωγή Τα δυαδικά δέντρα είναι μια από τις βασικές δομές δεδομένων που χρησιμοποιούνται στον προγραμματισμό... (Απλά) υαδικά έντρα Αναζήτησης ( Α) έντρα AVL (επόμενο μάθημα) Κοκκινόμαυρα έντρα Ένα δέντρο συνδυάζει τα πλεονεκτήματα δύο άλλων δομών Ενός ταξινομημένου πίνακα Μιας συνδεδεμένης λίστας Δομές Δεδομένων, 3ο Εξάμηνο 2
Ταξινομημένος Πίνακας Παρόλο που η αναζήτηση είναι γρήγορη υαδική αναζήτηση O(logN) Η εισαγωγή προϋποθέτει την εύρεση της κατάλληλης θέσης, και μετακίνηση των στοιχείων με μεγαλύτερα κλειδιά κατά μία θέση πάνω στον πίνακα Κατά μέσο όρο μετακίνηση των μισών στοιχείων (Ν/2 μετακινήσεις) Ο(Ν) Η διαγραφή είναι ομοίως αργή Δομές Δεδομένων, 3ο Εξάμηνο 3
Συνδεδεμένη Λίστα Οι εισαγωγές γίνονται γρήγορα σε μια συνδεδεμένη λίστα Ο(1) Η αναζήτηση ενός στοιχείου ξεκινά από την αρχή της λίστας και επισκέπτεται κάθε στοιχείο διαδοχικά, ώσπου να βρει αυτό που αναζητείται Κατά μέσο όρο θα επισκεφτούμε Ν/2 στοιχεία Ο(Ν) Δομές Δεδομένων, 3ο Εξάμηνο 4
Τι Είναι Δέντρο; Ένα δέντρο αποτελείται από κόμβους και ακμές Οι κόμβοι αναπαρίστανται με κύκλους Οι ακμές αναπαρίστανται με γραμμές που συνδέουν τους κύκλους Μετακίνηση στους κόμβους του δέντρου μέσω των ακμών Σε μία διαδρομή Από τη ρίζα προς τα κάτω (από πάνω προς τα κάτω) Δομές Δεδομένων, 3ο Εξάμηνο 5
Δέντρα Ένα συνδεδεμένο μη κατευθυνόμενο γράφημα χωρίς κύκλους Κάθε δύο κόμβοι ενός δέντρου συνδέονται με μοναδικό μονοπάτι Δομές Δεδομένων, 3ο Εξάμηνο 6
Δέντρα με Ρίζα Ένας κόμβος ορίζεται σαν ρίζα του δέντρου: το δέντρο «κρεμιέται» από αυτόν Τρεις απεικονίσεις του ίδιου δέντρου Η 2 η και 3 η απεικόνιση υπονοούν ως ρίζα τον κόμβο a και c αντίστοιχα Δομές Δεδομένων, 3ο Εξάμηνο 7
Ορολογία Δέντρων Ρίζα Γονέας Παιδί Φύλλο Υποδέντρο Μονοπάτι Επίσκεψη ιάσχιση Επίπεδα Κλειδί Δομές Δεδομένων, 3ο Εξάμηνο 8
m-αδικά Δέντρα m-αδικό δέντρο: κάθε εσωτερικός κόμβος έχει το πολύ m παιδιά Πλήρες m-αδικό δέντρο: κάθε εσωτερικός κόμβος έχει ακριβώς m παιδιά Δομές Δεδομένων, 3ο Εξάμηνο 9
Δυαδικό Δέντρο Αν κάθε κόμβος του δέντρου μπορεί να έχει το πολύ δύο παιδιά, το δέντρο ονομάζεται δυαδικό δέντρο Τα δύο παιδιά ονομάζονται αριστερό παιδί και δεξιό παιδί ανάλογα με τη θέση που έχουν Θα ασχοληθούμε με ένα συγκεκριμένο είδος δυαδικών δέντρων Τα δυαδικά δέντρα αναζήτησης ( Α) Το αριστερό υπόδεντρο ενός κόμβου πρέπει να περιέχει μόνο κόμβους με μικρότερα κλειδιά από τον κόμβο αυτό Το δεξιό υπόδεντρο ενός κόμβου πρέπει να περιέχει μόνο κόμβους με μεγαλύτερα κλειδιά από τον κόμβο αυτό Καθένα από τα αριστερό και δεξί υπόδεντρο πρέπει να είναι δυαδικά δέντρα αναζήτησης Για τον ορισμό ενός δυαδικού δέντρου αναζήτησης απαιτείται μία σχέση διάταξης προκειμένου να μπορούμε να ορίσουμε τις έννοιες μικρότερο, μεγαλύτερο Δομές Δεδομένων, 3ο Εξάμηνο 10
Παραδείγματα (1) υαδικό δέντρο αναζήτησης υαδικό δέντρο αναζήτησης? Δομές Δεδομένων, 3ο Εξάμηνο 11
Παραδείγματα (2) Όλα αυτά είναι υαδικά έντρα Αναζήτησης Δομές Δεδομένων, 3ο Εξάμηνο 12
Παράμετροι Δέντρου (1) Βάθος κομβου Το μήκος του μονοπατιού (σε πλήθος ακμών) από τη ρίζα προς τον κόμβο Η ρίζα έχει βάθος 0 Τα παιδιά της έχουν βάθος 1 Ύψος δέντρου Το μέγιστο μήκος οποιουδήποτε μονοπατιού που ξεκινά από τη ρίζα Ισοδύναμα, το μέγιστο βάθος οποιουδήποτε κόμβου Δομές Δεδομένων, 3ο Εξάμηνο 13
Παράμετροι Δέντρου (2) Δομές Δεδομένων, 3ο Εξάμηνο 14
Σύνοψη Πράξεων σε Δέντρα Αναζήτηση κόμβου με δεδομένο κλειδί Εισαγωγή κόμβου με δεδομένο κλειδί ιάσχιση δέντρου (tree traversal) Προδιατεταγμένη (pre-order) Ενδοδιατεταγμένη (in-order) Μεταδιατεταγμένη (post-order) ιαγραφή κόμβου με δεδομένο κλειδί Δομές Δεδομένων, 3ο Εξάμηνο 15
Δομές Δεδομένων, 3ο Εξάμηνο 16
Προσχέδιο Κλάσης Tree Δομές Δεδομένων, 3ο Εξάμηνο 17
Αναζήτηση Κόμβου Ξεκινάμε την αναζήτηση από τη ρίζα του δέντρου Αν το ζητούμενο αντικείμενο είναι ίσο με το αντικείμενο στη ρίζα, η διαδικασία αναζήτησης τερματίζει επιτυχώς Αν το ζητούμενο αντικείμενο είναι μικρότερο από το αντικείμενο της ρίζας, τότε η αναζήτηση συνεχίζεται στο αριστερό υποδέντρο ιαφορετικά (ζητούμενο αντικείμενο είναι μεγαλύτερο από το αντικείμενο της ρίζας, Η αναζήτηση συνεχίζεται στο δεξί υποδέντρο Αν η αναζήτηση καταλήξει σε κάποιον κόμβο απ όπου δεν υπάρχει σύνδεσμος (ακμή) για να συνεχίσει η αναζήτηση τότε το αντικείμενο δεν υπάρχει και η διαδικασία εύρεσής του είναι ανεπιτυχής Δομές Δεδομένων, 3ο Εξάμηνο 18
3<7 3>2 Αναζήτηση του στοιχείου 3 3<5 3==3 Αναζήτηση στοιχείου 3 ΕΠΙΤΥΧΗΣ!! 6>2 6<7 Αναζήτηση του στοιχείου 6 6>5 ΤΕΛΟΣ!! ΑΝΑΖΗΤΗΣΗ στοιχείου 6 ΑΝΕΠΙΤΥΧΗΣ Δομές Δεδομένων, 3ο Εξάμηνο 19
Δομές Δεδομένων, 3ο Εξάμηνο 20
Απόδοση Αναζήτησης Ο χρόνος που απαιτείται για την εύρεση ενός κόμβου εξαρτάται από το βάθος του Στη χειρότερη περίπτωση ο χρόνος αναζήτησης Ο(N) Όμως στην καλύτερη περίπτωση ο χρόνος αναζήτησης είναι ανάλογος του logn Δομές Δεδομένων, 3ο Εξάμηνο 21
Εισαγωγή Κόμβου Ξεκινώντας από την ρίζα του δέντρου αναζητούμε ένα κόμβο που περιέχει το αντικείμενο που πρόκειται να εισαχθεί Εάν το αντικείμενο βρεθεί, τότε περιέχεται ήδη στο δέντρο οπότε η διαδικασία της αναζήτησης τερματίζεται Αν η αναζήτηση είναι ανεπιτυχής φτάσαμε σε ένα κόμβο από όπου η αναζήτηση δεν μπορεί να συνεχίσει (δεν υπάρχει σύνδεσμος προς παιδί) τότε προσθέτουμε το νέο κόμβο ως παιδί του τρέχοντος κόμβου Δομές Δεδομένων, 3ο Εξάμηνο 22
Εισαγωγή κόμβου root current parent parent current parent current parent current parent.rightchild newnode Δομές Δεδομένων, 3ο Εξάμηνο 23
Δομές Δεδομένων, 3ο Εξάμηνο 24
Δομές Δεδομένων, 3ο Εξάμηνο 25
Διάσχιση Δέντρου ιάσχιση ενός δυαδικού δέντρου είναι η επεξεργασία όλων των κόμβων του με έναν συστηματικό τρόπο Προδιατεταγμένη διάσχιση (preorder tree traversal) Επίσκεψη κόμβου πριν επισκεφτούμε τα παιδιά του Μεταδιατεταγμένη διάσχιση (postorder tree traversal) Επίσκεψη κόμβου μετά την επίσκεψη των παιδιών του Ενδοδιατεταγμένη διάσχιση (inorder traversal) Επίσκεψη κόμβου μεταξύ της επίσκεψης του αριστερού και δεξιού παιδιού του. Δομές Δεδομένων, 3ο Εξάμηνο 26
Παραδείγματα Διάσχισης Δέντρου Δομές Δεδομένων, 3ο Εξάμηνο 27
Ενδοδιατεταγμένη Διάσχιση Σε ένα δυαδικό δέντρο αναζήτησης Μια ενδοδιατεταγμένη διάσχιση θα επιφέρει επίσκεψη των κομβων σε αύξουσα σειρά κλειδιού Συνεπώς, αποτελεί έναν απλό τρόπο για να δημιουργήσουμε μια ταξινομημένη λίστα των δεδομένων ενός δυαδικού δέντρου ιάσχιση με χρήση επαναληπτικής (αναδρομικής) μεθόδου οθέντος ενός κόμβου (αρχικά της ρίζας), η μέθοδος Καλεί τον εαυτό της για διάσχιση αριστερού υπόδεντρου κόμβου Επισκέπτεται τον κόμβο Καλεί τον εαυτό της για διάσχιση δεξιού υπόδεντρου κόμβου Δομές Δεδομένων, 3ο Εξάμηνο 28
Υλοποίηση Ενδοδιατεταγμένης Διάσχισης Δομές Δεδομένων, 3ο Εξάμηνο 29
Προδιατεταγμένη Διάσχιση οθέντος ενός κόμβου (αρχικά της ρίζας), η μέθοδος Επισκέπτεται τον κόμβο Καλεί τον εαυτό της για διάσχιση αριστερού υπόδεντρου κόμβου Καλεί τον εαυτό της για διάσχιση δεξιού υπόδεντρου κόμβου Δομές Δεδομένων, 3ο Εξάμηνο 30
Μεταδιατεταγμένη Διάσχιση οθέντος ενός κόμβου (αρχικά της ρίζας), η μέθοδος Καλεί τον εαυτό της για διάσχιση αριστερού υπόδεντρου κόμβου Καλεί τον εαυτό της για διάσχιση δεξιού υπόδεντρου κόμβου Επισκέπτεται τον κόμβο Δομές Δεδομένων, 3ο Εξάμηνο 31
Εύρεση Μέγιστων-Ελάχιστων Τιμών Η εύρεση ελάχιστων (αντίστοιχα μέγιστων) είναι πολύ απλή διαδικασία Για την ελάχιστη τιμή Ξεκινώντας από τη ρίζα ακολουθούμε συνεχώς αριστερό παιδί, μέχρι να φτάσουμε σε κόμβο που δεν έχει αριστερό παιδί Αυτός ο κόμβος είναι το ελάχιστο Αντίστοιχα, για μέγιστο ακολουθούμε δεξιό παιδί Δομές Δεδομένων, 3ο Εξάμηνο 32
Κώδικας public Node minimum() { Node current, last; current = root; while (current!= null) { last = current; current = current.leftchild; } return last; } Δομές Δεδομένων, 3ο Εξάμηνο 33
Διαγραφή Κόμβου ιακρίνονται 3 περιπτώσεις Ο κόμβος που θα διαγραφεί είναι φύλλο Ο κόμβος που θα διαγραφεί έχει ένα παιδί Ο κόμβος που θα διαγραφεί έχει δύο παιδιά Δομές Δεδομένων, 3ο Εξάμηνο 34
Δομές Δεδομένων, 3ο Εξάμηνο 35
Περίπτωση #1: Διαγραφή Κόμβου Χωρίς Παιδιά Αλλάζουμε το κατάλληλο πεδίο παιδιού στον πατέρα του κόμβου ώστε να είναι null και να μην δείχνει στον κόμβο parent if current node is left child parent.leftchild = null else parent.rightchild =null current node Δομές Δεδομένων, 3ο Εξάμηνο 36
Δομές Δεδομένων, 3ο Εξάμηνο 37
Περίπτωση #2: Διαγραφή Κόμβου με Ένα Παιδί Ο κόμβος έχει δύο συνδέσεις: Με τον πατέρα του Με το μοναδικό παιδί του Συνδέουμε τον πατέρα του κόμβου που διαγράφουμε απευθείας με το παιδί του Δομές Δεδομένων, 3ο Εξάμηνο 38
Περίπτωση #2: Διαγραφή Κόμβου με Ένα Παιδί parent current ιαγραφή του 5 parent.rightchild =current.leftchild Δομές Δεδομένων, 3ο Εξάμηνο 39
Περίπτωση #2: Διαγραφή Κόμβου με Ένα Υπόδεντρο parent current ypodentro = current.leftchild If ypodentro is null then ypodentro = current.rightchild ypodentro If parent.leftchild == current then parent.leftchild = ypodentro else parent.rightchild = ypodentro Δομές Δεδομένων, 3ο Εξάμηνο 40
Δομές Δεδομένων, 3ο Εξάμηνο 41
Περίπτωση #3: Διαγραφή Κόμβου με Δύο Παιδιά Για να διαγράψουμε έναν κόμβο με δύο παιδιά αντικαθιστούμε τον κόμβο με τον ενδοδιατεταγμένο διάδοχό του (inorder) Ενδοδιατεταγμένος διάδοχος ή διάδοχος ενός κόμβου Ο κόμβος με το επόμενο μεγαλύτερο κλειδί Δομές Δεδομένων, 3ο Εξάμηνο 42
Εύρεση Διαδόχου Ξεκινάμε από το δεξί παιδί του κόμβου και ακολουθούμε το μονοπάτι των αριστερών παιδιών ιαγραφή 2 εν υπάρχει αριστερό παιδί Ο 3 είναι διάδοχος του 2 Αντικατάσταση κόμβου 2 με το διάδοχό του Δομές Δεδομένων, 3ο Εξάμηνο 43
Ο Διάδοχος Δεξί Παιδί του προς Διαγραφή Κόμβου Μετακίνηση του υποδέντρου που είναι η ρίζα του διαδόχου και τοποθέτησή του εκεί που ήταν ο διαγραμμένος κόμβος 50 πατέρας 50 Βήμα 1 75 Πατέρας διαδόχου (current) ιαγραφή 75 87 Βήμα 2 62 87 ιάδοχος(successor) 62 93 93 1. parent.rightchild = successor; 2. successor.leftchild = current.leftchild; Δομές Δεδομένων, 3ο Εξάμηνο 44
Ο Διάδοχος Αριστερός Απόγονος του Δεξιού Παιδιού του προς Διαγραφή Κόμβου Μετακίνηση του υποδέντρου που είναι η ρίζα του διαδόχου και τοποθέτησή του εκεί που ήταν ο διαγραμμένος κόμβος 50 parent 50 Βήμα 3 62 75 (delnode-current) ιαγραφή 75 successorparent 87 Βήμα 4 62 77 Βήμα 1 Βήμα 2 87 79 93 ιάδοχος (successor) 77 79 93 1. successorparent.leftchild = successor.rightchild; 2. successor.rightchild = delnode.rightchild; 3. parent.rightchild = successor; 4. successor.leftchild = current.leftchild; 45 Δομές Δεδομένων, 3ο Εξάμηνο
Δομές Δεδομένων, 3ο Εξάμηνο 46
Διαγραφή Κόμβου με Δύο Παιδιά ΒΗΜΑ 1 Εάν ο κόμβος προς διαγραφή (current) είναι ρίζα τότε δεν έχει γονέα και απλά περνάμε τη ρίζα στο διάδοχο Αλλιώς ΒΗΜΑ 2 Ο κόμβος που θα διαγραφεί είναι αριστερό ή δεξί παιδί ορίζουμε το κατάλληλο πεδίο (leftchild ή rightchild) στο πατέρα του να δείχνει στο διάδοχο (successor) Ορίζουμε το αριστερό παιδί του successor να δείχνει το αριστερό παιδί του current βήμα2 βήμα1 47
Δομές Δεδομένων, 3ο Εξάμηνο 48
Πολυπλοκότητα Δυαδικών Δέντρων Αναζήτησης Η εισαγωγή και διαγραφή ενός κόμβου σ ένα Α βασίζονται στον αλγόριθμο αναζήτησης Ο απαιτούμενος χρόνος για την αναζήτηση ενός κόμβου είναι ανάλογος του ύψους h του δέντρου. υαδικό δέντρο με Ν κόμβους έχει ύψος τουλάχιστον h =log(n+1) -1 Όλες οι πράξεις ενός Α έχουν στην καλύτερη περίπτωση (όταν το Α είναι ισοζυγισμένο) πολυπλοκότητα O(logN), και στη χειρότερη Ο(Ν) Δομές Δεδομένων, 3ο Εξάμηνο 49
h=2 h=6 Ο(Ν) Ο(logΝ) ΔΔΑ με το ίδιο πλήθος κόμβων Η χρονική πολυπλοκότητα όλων των πράξεων ενός Α εξαρτάται από το σχήμα του Δομές Δεδομένων, 3ο Εξάμηνο 50
50 15 62 5 20 58 91 3 8 37 60 24 Α. είξτε το Α που προκύπτει μετά από καθεμία από τις παρακάτω πράξεις: 1) Εισαγωγή 7, 1, 55, 29 και 19 2) ιαγραφή 8, 37 και 62 Δομές Δεδομένων, 3ο Εξάμηνο 51