Ορισμοί Ιεραρχικός Μη γραμμικός τύπος δεδομένων Γονέας – Παιδιά Μη γραμμικός τύπος δεδομένων Γονέας – Παιδιά Αδέλφια: κόμβοι με κοινό πατέρα Πρόγονοι – Απόγονοι Ρίζα: κόμβος που δεν έχει γονέα Φύλλα: κόμβοι χωρίς παιδιά Ο γραμμικός χρόνος που απαιτούν οι διασυνδεδεμένες λίστες μπορεί να βελτιωθεί σε Ο(lgn) με χρήση δέντρων. Οι κόμβοι ενός δέντρου συνδέονται με πολύ πλουσιότερες σχέσεις από το «προηγούμενος» - «επόμενος» των γραμμικών δομών δεδομένων. Υποστηρίζουν και γραμμικότητα...
Δυαδικό Δέντρο Δέντρο, όπου κάθε κόμβος έχει το πολύ δύο παιδιά, το αριστερό και το δεξί. Μπορεί να έχει και ένα μόνον παιδί. Σε ένα γνήσιο δυαδικό δέντρο κάθε κόμβος έχει 0 ή 2 παιδιά. Α E H L N U Y R W X C D
Πλήρες δυαδικό δένδρο Αν σε όλα τα επίπεδά του, εκτός ίσως από το τελευταίο, έχει τον μέγιστο δυνατό αριθμό κόμβων και όλοι οι κόμβοι στο τελευταίο επίπεδο βρίσκονται όσο το δυνατό στα αριστερά του δένδρου.
Στατική Αναπαράσταση (1)
Στατική αναπαράσταση δυαδικού δένδρου (με πίνακα) Βασίζεται στην προηγούμενη ιδιότητα (των συμπληρωμένων δυαδικών δένδρων) Πρόβλημα: σπατάλη χώρου όταν λείπουν πολλά στοιχεία (για να γίνει το δένδρο πλήρες) Ένα δένδρο με n στοιχεία θα μπορούσε να απαιτήσει πίνακα μεγέθους μέχρι και 2n-1 (η περίπτωση των δεξιών λοξών δυαδικών δένδρων)
Συνδεδεμένη Αναπαράσταση (1)
Δυαδικά δένδρα αναζήτησης Binary search trees Δυαδικά δένδρα με τις παρακάτω ιδιότητες για κάθε κόμβο: όλοι οι κόμβοι του αριστερού παιδιού έχουν τιμές μικρότερες της τιμής του κόμβου όλοι οι κόμβοι του δεξιού παιδιού έχουν τιμές μεγαλύτερες ή ίσες της τιμής του κόμβου 10 5 34 58 71 17
Δέντρα δυαδικής αναζήτησης Η γενική εικόνα ενός τέτοιου δέντρου >=
Παραδείγματα δυαδικών δέντρων αναζήτησης Εγκυρα δέντρα
Παραδείγματα δυαδικών δέντρων αναζήτησης Μη-έγκυρα δέντρα
ΑΝΑΖΗΤΗΣΗ Συγκρίνουμε τη ρίζα του δένδρου με το υπό αναζήτηση στοιχείο και αν η τιμή του στοιχείου είναι μικρότερη, τότε προχωρούμε στο αριστερό παιδί της ρίζας, αν είναι μεγαλύτερη, τότε προχωρούμε στο δεξί παιδί της ρίζας. Το προηγούμενο βήμα επαναλαμβάνεται μέχρις ότου (α) συναντήσουμε το προς αναζήτηση στοιχείο (επιτυχία) ή (β) συναντήσουμε το κενό (υπο)δένδρο (αποτυχία).
ΕΙΣΑΓΩΓΗ Αν το δοθέν δένδρο είναι το κενό δένδρο τότε ο κόμβος του στοιχείου γίνεται η ρίζα του δένδρου. Αλλιώς, αν το στοιχείο δεν υπάρχει τότε γίνεται εισαγωγή του στοιχείου σαν ρίζα του αντίστοιχου (αριστερού ή δεξιού) κενού υποδένδρου που ανιχνεύθηκε με τον βασικό αλγόριθμο αναζήτησης. Τέλος, αν το στοιχείο υπάρχει, δεν τίθεται θέμα εισαγωγής του.
Εισαγωγή στοιχείου σε ΔΔΑ Βασική ιδιότητα ΔΔΑ: Η εισαγωγή γίνεται πάντα σε κάποιο (νέο) φύλλο Διαδικασία: Αναζήτηση του στοιχείου (οπότε καταλήγουμε σε κόμβο-φύλλο) Εισαγωγή του ως παιδί εκείνου του κόμβου
ΔΙΑΓΡΑΦΗ (1) Αν βρεθεί ο κόμβος Νx που έχει το στοιχείο, τότε ακολουθείται η εξής διαδικασία (τρεις περιπτώσεις): Αν ο Νx δεν έχει παιδιά, τότε διαγράφεται ο Νx και τη θέση του καταλαμβάνει το κενό δένδρο. Αν ο Νx έχει μόνο ένα παιδί, τότε διαγράφεται ο Νx και τη θέση του καταλαμβάνει το μοναδικό παιδί του.
ΔΙΑΓΡΑΦΗ (2)
Πολυπλοκότητα δέντρων Αναζήτηση με πολυπλοκότητα Από Ο(Ν) [χειρότερη περίπτωση] Μέχρι Ο(Log2N) [καλύτερη περίπτωση]
Υψος ΔΔΑ (1) Στη γενική περίπτωση όμως (όταν οι εισαγωγές και οι διαγραφές γίνονται τυχαία), το ύψος είναι O(logn) κατά μ.ό.
Υψος ΔΔΑ (2) Για το ύψος h ενός πλήρους δένδρου n κόμβων ισχύει (πάνω όριο): h logn. Ο ελάχιστος αριθμός κόμβων σε ένα πλήρες δένδρο ύψους h είναι (20+21+22+ … +2h-1) + 1 δηλαδή, συμπληρωμένα τα επίπεδα μέχρι ύψος (h-1) συν ένα κόμβο από το τελευταίο επίπεδο. Αλλά (20+21+22+ … +2h-1) = 2h-1, οπότε ο ελάχιστος αριθμός κόμβων γίνεται τελικά (2h-1) + 1 = 2h. Δηλαδή, για ένα δένδρο n στοιχείων, είναι n 2h logn log(2h) h logn.
ΣΥΓΚΡΙΣΕΙΣ Για ένα «μέσο» δένδρο η πολυπλοκότητα είναι f(n) = O(logn)