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

Σχετικά έγγραφα
ΗΥ240 - Παναγιώτα Φατούρου 1

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

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

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

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

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

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

Δομές δεδομένων. Ενότητα 8: Ξένα Σύνολα που υποστηρίζουν τη λειτουργία της Ένωσης (Union-Find) Παναγιώτα Φατούρου Τμήμα Επιστήμης Υπολογιστών

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

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

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

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

Εισαγωγή στους Αλγορίθμους

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

Σχεδίαση και Ανάλυση Αλγορίθμων Ενότητα 4: ΑΝΑΠΑΡΑΣΤΑΣΗ ΔΕΔΟΜΕΝΩΝ - ΔΕΝΤΡΑ

Ενδεικτικές λύσεις ασκήσεων διαχείρισης έργου υπό συνθήκες αβεβαιότητας

Εισαγωγή στους Αλγορίθμους

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

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

Προγραμματισμός Η/Υ. Βασικές Προγραμματιστικές Δομές. ΤΕΙ Ιονίων Νήσων Τμήμα Τεχνολόγων Περιβάλλοντος Κατεύθυνση Τεχνολογιών Φυσικού Περιβάλλοντος

Διοικητική Λογιστική

Αλγόριθμοι και πολυπλοκότητα Συγχωνευτική Ταξινόμηση

1 η Διάλεξη. Ενδεικτικές λύσεις ασκήσεων

Βάσεις Περιβαλλοντικών Δεδομένων

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

Εισαγωγή στους Αλγορίθμους

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

ΣΥΣΤΗΜΑΤΑ ΗΛΕΚΤΡΙΚΗΣ ΕΝΕΡΓΕΙΑΣ ΙIΙ

ΣΥΣΤΗΜΑΤΑ ΗΛΕΚΤΡΙΚΗΣ ΕΝΕΡΓΕΙΑΣ ΙIΙ

ΣΥΣΤΗΜΑΤΑ ΗΛΕΚΤΡΙΚΗΣ ΕΝΕΡΓΕΙΑΣ ΙIΙ

Θερμοδυναμική. Ανοικτά Ακαδημαϊκά Μαθήματα. Πίνακες Νερού σε κατάσταση Κορεσμού. Γεώργιος Κ. Χατζηκωνσταντής Επίκουρος Καθηγητής

Αλγόριθμοι και πολυπλοκότητα Ταχυταξινόμηση (Quick-Sort)

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

Ανοικτά Ακαδημαϊκά Μαθήματα στο ΤΕΙ Αθήνας. Βιοστατιστική (Ε) Ενότητα 3: Έλεγχοι στατιστικών υποθέσεων

Πληροφορική ΙΙ Θεματική Ενότητα 5

Ανοικτά Ακαδημαϊκά Μαθήματα στο ΤΕΙ Αθήνας. Βιοστατιστική (Ε) Ενότητα 1: Καταχώρηση δεδομένων

Εισαγωγή στους Αλγορίθμους Ενότητα 9η Άσκηση - Αλγόριθμος Prim

Ανοικτά Ακαδημαϊκά Μαθήματα στο ΤΕΙ Αθήνας. Βιοστατιστική (Ε) Ενότητα 2: Περιγραφική στατιστική

Εισαγωγή στους Αλγορίθμους Φροντιστήριο 2

Λογιστική Κόστους Ενότητα 12: Λογισμός Κόστους (2)

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

Μαθηματικά Διοικητικών & Οικονομικών Επιστημών

Εισαγωγή στους Η/Υ. Ενότητα 2β: Αντίστροφο Πρόβλημα. Δημήτρης Σαραβάνος, Καθηγητής Πολυτεχνική Σχολή Τμήμα Μηχανολόγων & Αεροναυπηγών Μηχανικών

Πληροφοριακά Συστήματα Διοίκησης (ΜΒΑ) Ενότητα 3: Εφαρμογές Δικτυωτής Ανάλυσης (2 ο Μέρος)

Εισαγωγή στους Αλγορίθμους Ενότητα 10η

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

Λογιστική Κόστους Ενότητα 8: Κοστολογική διάρθρωση Κύρια / Βοηθητικά Κέντρα Κόστους.

Οντοκεντρικός Προγραμματισμός

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

Εισαγωγή στους Υπολογιστές

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

Εισαγωγή στην Πληροφορική

Διεθνείς Οικονομικές Σχέσεις και Ανάπτυξη

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

Εισαγωγή στους Αλγορίθμους Ενότητα 10η Άσκηση Αλγόριθμος Dijkstra

Σχεδίαση και Ανάλυση Αλγορίθμων Ενότητα 11: ΠΡΟΒΛΗΜΑ ΔΙΑΤΡΕΞΗΣ ΓΡΑΦΗΜΑΤΟΣ

Τίτλος Μαθήματος: Μαθηματική Ανάλυση Ενότητα Γ. Ολοκληρωτικός Λογισμός

Κβαντική Επεξεργασία Πληροφορίας

ΗΛΕΚΤΡΟΝΙΚΗ ΙIΙ Ενότητα 6

Εισαγωγή στους Αλγορίθμους Φροντιστήριο 5

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

Αλγόριθμοι και πολυπλοκότητα Μελανέρυθρα δεντρα

Διοικητική Λογιστική

Μαθηματικά Διοικητικών & Οικονομικών Επιστημών

Πληροφοριακά Συστήματα Διοίκησης (ΜΒΑ) Ενότητα 2: Εφαρμογές Δικτυωτής Ανάλυσης (1 ο Μέρος)

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

Μάρκετινγκ Αγροτικών Προϊόντων

Σχεδίαση και Ανάλυση Αλγορίθμων Ενότητα 8: ΧΡΗΣΗ ΔΟΜΩΝ ΔΕΝΤΡΟΥ ΚΑΙ ΣΩΡΟΥ ΓΙΑ ΕΠΙΛΥΣΗ ΠΡΟΒΛΗΜΑΤΟΣ ΤΑΞΙΝΟΜΗΣΗΣ ΑΛΓΟΡΙΘΜΟΣ HEAPSORT

Μυελού των Οστών Ενότητα #1: Ερωτήσεις κατανόησης και αυτόαξιολόγησης

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

Εισαγωγή στην Διοίκηση Επιχειρήσεων

Λογικός Προγραμματισμός Ασκήσεις

Θέματα υπολογισμού στον πολιτισμό

Ενότητα. Εισαγωγή στις βάσεις δεδομένων

Αλγόριθμοι και πολυπλοκότητα Δυναμικός Προγραμματισμός

Βέλτιστος Έλεγχος Συστημάτων

Εισαγωγή στους Αλγορίθμους Ενότητα 9η Άσκηση - Αλγόριθμος Kruskal

Εισαγωγή στους Αλγορίθμους Φροντιστήριο 7

Αριθμητική Ανάλυση. Ενότητα 1: Εισαγωγή Βασικές Έννοιες. Φραγκίσκος Κουτελιέρης Πολυτεχνική Σχολή Τμήμα Χημικών Μηχανικών

Βάσεις Περιβαλλοντικών Δεδομένων

Μαθηματικά Διοικητικών & Οικονομικών Επιστημών

Μαθηματικά Διοικητικών & Οικονομικών Επιστημών

4 η Διάλεξη. Ενδεικτικές λύσεις ασκήσεων

Τεχνικό Σχέδιο - CAD

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

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

Γραμμική Άλγεβρα και Μαθηματικός Λογισμός για Οικονομικά και Επιχειρησιακά Προβλήματα

Θερμοδυναμική. Ανοικτά Ακαδημαϊκά Μαθήματα. Πίνακες Νερού Υπέρθερμου Ατμού. Γεώργιος Κ. Χατζηκωνσταντής Επίκουρος Καθηγητής

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

Ψηφιακή Επεξεργασία Εικόνων

Φυσική ΙΙΙ. Ενότητα 4: Ηλεκτρικά Κυκλώματα. Γεώργιος Βούλγαρης Σχολή Θετικών Επιστημών Τμήμα Φυσικής

Κβαντική Επεξεργασία Πληροφορίας

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

Χωρικές σχέσεις και Γεωμετρικές Έννοιες στην Προσχολική Εκπαίδευση

Μηχανολογικό Σχέδιο Ι

Εισαγωγή στους Αλγορίθμους Φροντιστήριο 8

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

Τεχνικό Σχέδιο - CAD

Δομημένος Προγραμματισμός

Μηχανολογικό Σχέδιο Ι

Transcript:

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

ΕΝΟΤΗΤΑ 3 ΔΕΝΔΡΑ ΗΥ240 - Παναγιώτα Φατούρου 2

Δένδρα Ένα δένδρο Τ αποτελείται από ένα σύνολο από κόμβους μεταξύ των οποίων ορίζεται μια σχέση γονέα-παιδιού με τις εξής ιδιότητες: Αν το Τ δεν είναι το κενό δένδρο, περιέχει έναν ειδικό κόμβο που ονομάζεται ρίζα και δεν έχει γονέα. Για οποιοδήποτε άλλο κόμβο v του Τ υπάρχει ένας μοναδικός κόμβος στο Τ που αποτελεί το γονέα του v. Κόμβοι (nodes) Ακμές (edges) Γονέας Παιδί Αδελφικός κόμβος (parent, child, sibling) Μονοπάτι (path) Πρόγονος απόγονος (ancestor, descendant) Φύλλο Εσωτερικός κόμβος (leaf, non-leaf) ΗΥ240 - Παναγιώτα Φατούρου 3

Δένδρα Αναδρομικός Ορισμός Σχήμα 4.3: Lewis & Denenberg, Data Structures & Their Algorithms, Addison-Wesley, 1991 Ένα κενό δένδρο Τ δεν περιέχει κόμβους και ακμές. Ένα (μη-κενό) δένδρο Τ είναι ένα πεπερασμένο σύνολο από έναν ή περισσότερους κόμβους τ.ω.: Ένας μόνο κόμβος (χωρίς καμία ακμή) αποτελεί ένα δένδρο. Ο κόμβος αυτός είναι και ρίζα του δένδρου. Έστω ότι Τ 1,..., Τ κ (κ > 0) είναι δένδρα που δεν μοιράζονται κόμβους και έστω r 1,..., r k οι ρίζες τους. Έστω r ένας νέος κόμβος. Αν το Τ αποτελείται από τους κόμβους και τις ακμές των Τ 1,..., Τ κ, το νέο κόμβο r και τις νέες ακμές <r,r 1 >, <r,r 2 >,, <r,r k >, τότε το Τ είναι δένδρο. Η ρίζα του Τ είναι το r. Τα Τ 1,..., Τ κ είναι τα υποδένδρα του Τ. ΗΥ240 - Παναγιώτα Φατούρου 4

Δένδρα Βαθμός Κόμβου (node degree) Ο αριθμός των παιδιών του κόμβου. Βαθμός Δένδρου (tree degree) Μέγιστος βαθμός μεταξύ των βαθμών των κόμβων του δένδρου. Επίπεδο (level) Η ρίζα βρίσκεται στο επίπεδο 0. Ένας κόμβος βρίσκεται στο επίπεδο k αν η απόσταση του από τη ρίζα είναι k. Το επίπεδο είναι επομένως ένα σύνολο από κόμβους. Ύψος Κόμβου (node height) Μήκος μακρύτερου μονοπατιού από τον κόμβο σε οποιοδήποτε φύλλο. Ύψος Δένδρου (tree height) Μέγιστο ύψος μεταξύ των υψών των κόμβων του δένδρου. Βάθος Κόμβου (node depth) Μήκος μονοπατιού από τη ρίζα στον κόμβο. Ύψος Δένδρου = Βάθος Δένδρου Βάθος Δένδρου (tree depth) Μέγιστο βάθος μεταξύ των βαθών των κόμβων του δένδρου. ΗΥ240 - Παναγιώτα Φατούρου 5

Είδη Δένδρων Διατεταγμένο Δένδρο Δένδρο στο οποίο έχει οριστεί μια διάταξη στα παιδιά κάθε κόμβου. Δυαδικό δένδρο Διατεταγμένο δένδρο του οποίου κάθε κόμβος έχει το πολύ δύο παιδιά (ένα αριστερό και ένα δεξί). λ (nill ή NULL): κενό δυαδικό δένδρο (χωρίς κόμβους και ακμές) Διατεταγμένα Δένδρα Δυαδικό Δένδρο Γεμάτο Δυαδικό Δένδρο (full binary tree) Δεν υπάρχει κόμβος με μόνο ένα παιδί στο δένδρο. Τέλειο Δυαδικό Δένδρο (perfect binary tree) Γεμάτο δυαδικό δένδρο στο οποίο όλα τα φύλλα έχουν το ίδιο βάθος. Δάσος Πεπερασμένο σύνολο από δένδρα. Γεμάτο Δυαδικό Δένδρο Τέλειο Δυαδικό Δένδρο ΗΥ240 - Παναγιώτα Φατούρου 6

Είδη Δένδρων Πλήρες Δυαδικό Δένδρο Ύψους h (complete binary tree of height h) Αποτελείται από ένα τέλειο δυαδικό δένδρο ύψους h-1 στο οποίο έχουν προστεθεί ένα ή περισσότερα φύλλα με ύψος h. Τα φύλλα αυτά έχουν τοποθετηθεί στις αριστερότερες θέσεις του δένδρου. Αναδρομικός Ορισμός Ένα πλήρες δυαδικό δένδρο ύψους 0 αποτελείται από ένα μόνο κόμβο. Ένα πλήρες δυαδικό δένδρο ύψους 1 είναι Χ ένα δένδρο ύψους 1 στο οποίο η ρίζα έχει είτε δύο παιδιά ή ένα μόνο αριστερό παιδί. Ένα πλήρες δυαδικό δένδρο ύψους h>1, αποτελείται από μια ρίζα και 2 υποδένδρα τ.ω: είτε το αριστερό υποδένδρο είναι τέλειο ύψους h-1 και το δεξιό είναι πλήρες ύψους h-1, ή το αριστερό υποδένδρο είναι πλήρες ύψους h-1 και το δεξιό είναι τέλειο ύψους h-2. h-1 h-1 h-2 ΗΥ240 - Παναγιώτα Φατούρου 7 h h-1

Ιδιότητες Δυαδικών Δένδρων Πρόταση Ένα τέλειο δυαδικό δένδρο ύψους h έχει 2 h+1 1 κόμβους, εκ των οποίων 2 h είναι φύλλα και 2 h 1 είναι εσωτερικοί κόμβοι. Απόδειξη Με επαγωγή στο h. Βάση επαγωγής, h = 0 Το τέλειο δυαδικό δένδρο ύψους 0 αποτελείται από έναν μόνο κόμβο-ρίζα και άρα έχει 1 κόμβο που είναι φύλλο και 0 εσωτερικούς κόμβους. Πράγματι: 2 h+1 1 = 2 0+1 1 = 2 1 = 1 κόμβος 2 h = 2 0 = 1 φύλλο 2 h 1 = 0 εσωτερικοί κόμβοι Επαγωγική Υπόθεση Θεωρούμε έναν οποιονδήποτε ακέραιο k >=0. Έστω ότι οποιοδήποτε τέλειο δυαδικό δένδρο ύψους k έχει 2 k+1 1 κόμβους, εκ των οποίων 2 k είναι φύλλα και 2 k 1 είναι εσωτερικοί κόμβοι. ΗΥ240 - Παναγιώτα Φατούρου 8 h

Ιδιότητες Δυαδικών Δένδρων Επαγωγικό βήμα Θα αποδείξουμε ότι ο ισχυρισμός είναι σωστός για δένδρα ύψους k+1. Ένα τέλειο δένδρο Τ ύψους k+1 αποτελείται από 2 τέλεια δένδρα ύψους k (έστω Τ 1, Τ 2 ) και τη ρίζα του. Από επαγωγική υπόθεση καθένα από τα Τ 1, Τ 2, έχει 2 κ+1 1 κόμβους, εκ των οποίων 2 κ είναι φύλλα και 2 κ 1 είναι εσωτερικοί κόμβοι. k k+1 Άρα το Τ έχει: 2*(2 κ+1 1) +1 κόμβους = 2 κ+2 1 κόμβους (όπως απαιτείται), εκ των οποίων: 2 κ + 2 κ = 2 κ+1 είναι φύλλα (όπως απαιτείται), και 2*(2 κ 1) + 1 = 2 κ+1 1 είναι εσωτερικοί κόμβοι (όπως απαιτείται). ΗΥ240 - Παναγιώτα Φατούρου 9

Ενδεικτικές Λειτουργίες σε Δένδρα Parent(v): επιστρέφει τον κόμβο γονέα του κόμβουv ή nill αν ο v είναι η ρίζα Children(v): επιστρέφει το σύνολο των παιδιών του v ή το άδειο σύνολο αν ο v είναι φύλλο FirstChild(v): επιστρέφει το πρώτο παιδί του v ή nill αν ο v είναι φύλλο (σε διατεταγμένα δένδρα) RightSibling(v): επιστρέφει το δεξιό αδελφικό κόμβο του v ή nill αν ο v είναι η ρίζα ή το δεξιότερο παιδί του γονικού του κόμβου LeftSibling(v): επιστρέφει τον αριστερό αδελφικό κόμβο του v ή nill αν ο v είναι η ρίζα ή το αριστερότερο παιδί του γονικού του κόμβου ΗΥ240 - Παναγιώτα Φατούρου 10

Ενδεικτικές Λειτουργίες σε Δένδρα IsLeaf(v): επιστρέφει true αν ο v είναι φύλλο, false διαφορετικά Depth(v): επιστρέφει το βάθος του v στο δένδρο Height(v): επιστρέφει το ύψος του v στο δένδρο Σε δυαδικά δένδρα LeftChild(v) (RightChild(v)): επιστρέφει το αριστερό (δεξιό, αντίστοιχα) παιδί του v (ή nill) ΗΥ240 - Παναγιώτα Φατούρου 11

Υλοποίηση Δυαδικών Δένδρων Κάθε κόμβος έχει ένα πεδίο data και δύο δείκτες LC (Left Child) και RC (Right Child) που δείχνουν στο αριστερό και στο δεξιό παιδί του κόμβου αντίστοιχα. Οι λειτουργίες LeftChild() και RightChild() υλοποιούνται πολύ εύκολα σε Θ(1) χρόνο. Απλά-συνδεδεμένο δένδρο LC Data Parent RC Είναι το ίδιο αλήθεια για τη λειτουργία Parent()? Αποδοτική Υλοποίηση της Parent() Κρατάμε και ένα τρίτο δείκτη σε κάθε κόμβο που δείχνει στον κόμβο γονέα (διπλά-συνδεδεμένο δένδρο). Διπλά-συνδεδεμένο δένδρο ΗΥ240 - Παναγιώτα Φατούρου 12

Δένδρα Αριθμητικών Εκφράσεων Υπολογισμός Αριθμητικής Έκφρασης Label(v): αριθμός ή πράξη που αποτελεί τα data του v ApplyOp(op: operation, x,y: numbers): υπολογίζει την έκφραση x <op> y, ανάλογα με το ποια πράξη είναι το op. function Evaluate(pointer P): integer /* Return value of the expression represented by the tree with root P */ integer x_l, x_r, res; if IsLeaf(P) then return Label(P) else { x_l = Evaluate(LeftChild(P)) x_r = Evaluate(RightChild(P)) op = Label(P) res = ApplyOp(op, x_l, x_r); return res; } ΗΥ240 - Παναγιώτα Φατούρου 13

Ιχνηλάτιση της Evaluate() function Evaluate(pointer P): integer /* Return value of the expression represented by the tree with root P */ integer x_l, x_r, res; if IsLeaf(P) then return Label(P) else { x_l = Evaluate(LeftChild(P)) x_r = Evaluate(RightChild(P)) op = Label(P) res = ApplyOp(op, x_l, x_r); return res; } if IsLeaf(P->A) -> FALSE x_l = Evaluate(P->B); (<- 10) if IsLeaf(P->B) -> FALSE x_l = Evaluate(P->C); (<- 20) if IsLeaf(P->C) return 20; x_r = Evaluate(P->D); (<- 2) if IsLeaf(P->D) return 2; res = ApplyOp( /, 20, 2) = 20 / 2 = 10; return 10; x_r = Evaluate(P->E); (<- 3) if IsLeaf(P->E) return 3; res = ApplyOp( +, 10, 3) = 10 + 3 = 13; return 13; ΗΥ240 - Παναγιώτα Φατούρου 14

Διάσχιση Δένδρων Διάσχιση ή διέλευση δένδρου (tree traversal) χαρακτηρίζεται κάθε διαδικασία επισκέψεωςεπεξεργασίας όλων των κόμβων του δένδρου με συστηματικό τρόπο. Ισοδύναμα, θα μπορούσε να ορισθεί ως επιβολή ολικής διατάξεως επί των κόμβων του δένδρου μέσω συστηματικής επεξεργασίας των δεδομένων των κόμβων βάσει αυτής της διατάξεως. Σχήμα 4.10(α): Lewis & Denenberg, Data Structures & Their Algorithms, Addison-Wesley, 1991 Η ύπαρξη πολλαπλών δυνατοτήτων για τη διάταξη ενός κόμβου ως προς τους απογόνους του, οδηγεί σε διάφορα είδη διασχίσεων (προδιατεταγμένη διάσχιση, μεταδιατεταγμένη διάσχιση, ενδοδιατεγμένη διάσχιση). Visit(pointer p): αυθαίρετη λειτουργία που εφαρμόζεται στον κόμβο στον οποίο δείχνει ο δείκτης P Παράδειγμα Τύπωση των δεδομένων του κόμβου Visit(pointer p) { print(p->data); } ΗΥ240 - Παναγιώτα Φατούρου 15

Προδιατεταγμένη Διάσχιση Για κάθε κόμβο v, η προδιατεταγμένη διάσχιση κάνει τα εξής με τη σειρά που αναφέρονται: Επίσκεψη του v Επίσκεψη των υποδένδρων του v ξεκινώντας από το αριστερότερο προς το δεξιότερο υποδένδρο του. Η διαδικασία διάσχισης ξεκινά από τη ρίζα. Κάθε κόμβος προηγείται των παιδιών του στην διάταξη που προκύπτει. Procedure PreOrder(pointer p) { /* P is a pointer to the root of α general tree */ Visit(p); foreach child q of p, in order (from left to right) PreOrder(q); } Προδιατεταγμένη Διάταξη ΗΥ240 - Παναγιώτα Φατούρου 16

Προδιατεταγμένη Διάσχιση Procedure PreOrder(pointer p) { /* General Tree */ /* P is a pointer to the root of α general tree */ Visit(p); foreach child q of p, in order (from left to right) PreOrder(q); } Προδιατεταγμένη Διάταξη Procedure PreOrder(pointer p) { /* Binary Tree */ /* p is a pointer to the root of a binary tree */ Visit(p); PreOrder(p->LC); PreOrder(p->RC); } Παράδειγμα Εκτύπωση Κόμβων A,B,E,F,H,I,C,D,G,J,L,K ΗΥ240 - Παναγιώτα Φατούρου 17

Ιχνηλατώντας την PreOrder PreOrder(p->A) if (p == NULL) // αποτιμάται σε FALSE print(p->a); // τυπώνει το Α PreOrder(p->Β); if (p == NULL) // -> FALSE print(p->β); // τυπώνει το Β PreOrder(p->E); if (p == NULL) // -> FALSE print(p->e); // τυπώνει το E PreOrder(NULL); // LC του Ε PreOrder(NULL) // RC του E PreOrder(p->F); if (p == NULL) // -> FALSE print(p->f); // τυπώνει το F PreOrder(p->H); if (p == NULL) // -> FALSE print(p->h); // τυπώνει το H PreOrder(NULL); // LC του H PreORder(NULL) // RC του H PreOrder(p->I); if (p == NULL) // -> FALSE print(p->i); // τυπώνει το I PreOrder(NULL); // LC του I PreOrder(NULL) // RC του I // τέλος PreORder(p->I), PreOrder(p->F) & PreOrder(p->B) PreOrder(p->D); if (p == NULL) // -> FALSE print(p->d); // τυπώνει το D PreOrder(p->G); if (p == NULL) // -> FALSE print(p->g); // τυπώνει το G PreOrder(p->J); // LC του G if (p == NULL) // -> FALSE print(p->j); // τυπώνει το J PreOrder(p->L); if (p == NULL) // -> FALSE print(p->l); // τυπώνει το L PreOrder(NULL); // LC του L PreORder(NULL) // RC του L PreOrder(NULL); // RC του J PreOrder(P->K); if (p == NULL) // -> FALSE print(p->k); // τυπώνει το K PreOrder(NULL); // LC του K PreOrder(NULL) // RC του K PreOrder(NULL); // RC του D // τέλος PreOrder(p->D) & PreORder(p->A) ΗΥ240 - Παναγιώτα Φατούρου 18

Μεταδιατεταγμένη Διάσχιση Για κάθε κόμβο v, η μεταδιατεταγμένη διάσχιση κάνει τα εξής με τη σειρά που αναφέρονται: Επίσκεψη των υποδένδρων του v ξεκινώντας από το αριστερότερο προς το δεξιότερο υποδένδρο του. Επίσκεψη του v Η διαδικασία διάσχισης ξεκινά από τη ρίζα. Κάθε κόμβος έπεται των παιδιών του στην διάταξη. Procedure PostOrder(pointer p) { /* p is a pointer to the root of a general tree */ } foreach child q of p, in order { Postorder(q); } Visit(p); ΗΥ240 - Παναγιώτα Φατούρου 19

Μεταδιατεταγμένη Διάσχιση Procedure PostOrder(pointer p) { /* General Tree */ /* p is a pointer to the root of a general tree */ } foreach child q of p, in order { Postorder(q); } Visit(p); Procedure PostOrder(pointer p) { /* Binary Tree */ /*p is a pointer to the root of a binary tree*/ } PostOrder(p->LC); PostOrder(p->RC); Visit(p); Ιχνηλατίστε την εκτέλεση της PostOrder() πάνω στο δένδρο του Σχήματος. Παράδειγμα Εκτύπωση Κόμβων E,H,I,F,B,C,L,J,K,G,D,A ΗΥ240 - Παναγιώτα Φατούρου 20

A Ενδοδιατεγμένη Διάσχιση Για κάθε κόμβο v, η ενδοδιατεταγμένη διάσχιση ενός δυαδικού δένδρου κάνει τα εξής με τη σειρά που αναφέρονται: Επίσκεψη του αριστερού υποδένδρου του v Επίσκεψη του v Επίσκεψη του δεξιού υποδένδρου του v Η διαδικασία διάσχισης ξεκινά από τη ρίζα. Το αριστερό παιδί ενός κόμβου v προηγείται του v, ενώ το δεξιό παιδί του έπεται του v στην διάταξη. Procedure InOrder(pointer p) { /* p is a pointer to the root of a binary tree */ InOrder(p->LC); Visit(p); InOrder(p->RC); } Παράδειγμα Εκτύπωσης D,B,G,E,H,A,C,K,I,F,J B C D E F G H I J K 7 10 9 11 ΗΥ240 - Παναγιώτα Φατούρου 8 21

Διασχίσεις Δένδρων Διάσχιση Δένδρου κατά Επίπεδα (κατά πλάτος) Επισκέπτεται τους κόμβους κατά αύξον βάθος και τους κόμβους του ίδιου επιπέδου από τα αριστερά προς τα δεξιά. Χρήση Ουράς Αρχικά η ουρά περιέχει μόνο τη ρίζα. Στη συνέχεια επαναληπτικά: κάνουμε Deque ένα στοιχείο της ουράς και προσθέτουμε τα παιδιά από αριστερά προς τα δεξιά του στοιχείου αυτού. Procedure LevelOrder(pointer r) { Queue Q; pointer P; MakeEmptyQueue(Q); Enqueue(Q,r); while (! IsEmptyQueue(Q)) { P = Dequeue(Q); Visit(P); foreach child c of P, in order, do Enqueue(c); } } Παράδειγμα Περιεχόμενα Ουράς Α B, C, D C, D, E, F D, E, F E, F, G F, G G, H, I H, I, J, K I, J, K J, K K, L L <empty> ΗΥ240 - Παναγιώτα Φατούρου 22

Διασχίσεις Δένδρων Με Χρήση Στοίβας Αναδρομικές λύσεις έχουν ήδη συζητηθεί. Χρονική Πολυπλοκότητα Διάσχισης; Ο(ng(n)), όπου n το πλήθος των κόμβων και g(n) η χρονική πολυπλοκότητα της Visit() Χωρική Πολυπλοκότητα; Μέγεθος στοίβας ανάλογο του ύψους του δένδρου. Διάσχιση κατά Επίπεδα Χρονική Πολυπλοκότητα Διάσχισης; Ο(ng(n)) Χωρική Πολυπλοκότητα; Πόσους κόμβους μπορεί να περιέχει η ουρά στη χειρότερη περίπτωση; ΗΥ240 - Παναγιώτα Φατούρου 23

Υλοποίηση Διατεταγμένων Δένδρων με Βαθμό Μεγαλύτερο του Δύο Αν είναι γνωστό το μέγιστο πλήθος παιδιών ενός κόμβου (έστω MC), τότε κάθε κόμβος θα περιέχει έναν πίνακα με MC δείκτες, έναν για κάθε δυνητικό παιδί του (κάποιοι από τους δείκτες μπορεί να είναι NULL αν τα αντίστοιχα παιδιά δεν υπάρχουν). ΗΥ240 - Παναγιώτα Φατούρου 24

Υλοποίηση Διατεταγμένων Δένδρων Τι γίνεται αν δεν γνωρίζουμε τον αριθμό των παιδιών που μπορεί να έχει κάποιος κόμβος; Απεικόνιση Διατεταγμένου Δένδρου ως Δυαδικό Αν κάθε κόμβος διασυνδέεται με το αριστερότερο παιδί του και με τον πρώτο στα δεξιά αδελφικό του κόμβο, τότε αρκούν δύο δείκτες σε κάθε κόμβο. Το αρχικό δένδρο μετασχηματίζεται σε δυαδικό! (Α) (Β) Σχήμα 4.10(α): Lewis & Denenberg, Data Structures & Their Algorithms, Addison-Wesley, 1991 Μορφή Κόμβου LC data RS LC: Left Child RS: Right Sibling ΗΥ240 - Παναγιώτα Φατούρου 25

Υλοποίηση Διατεταγμένων Δένδρων Μπορούμε να τυπώσουμε το διατεταγμένο δένδρο (Α) βασιζόμενοι στο δυαδικό δένδρο (Β); Procedure PrintTree(pointer R) { if (R == NULL) return; Visit(R); PrintTree(R->LC); PrintTree(R->RS); } Ύψος δυαδικού ως προς το αρχικό δένδρο; Πολυπλοκότητες FirstChild(), RightSibling(): Θ(1) kth-child(k, v), εύρεση του k-οστού παιδιού του v: Θ(k). Parent(): δεν υποστηρίζεται αποδοτικά. (Α) (Β) Procedure Visit(pointer R) { pointer P; print(r->data); print( Children: ); P = R->LC; while (P!= NULL) { print(p->data); P = P->RS; } print( \n ); } ΗΥ240 - Παναγιώτα Φατούρου 26

Υλοποίηση Πλήρων Δυαδικών Δένδρων Υπάρχει μόνο ένα πλήρες δυαδικό δένδρο με n κόμβους και το υλοποιούμε με ένα πίνακα N στοιχείων. Αριθμούμε τους κόμβους με αριθμούς στο διάστημα {0,...,n-1} και αποθηκεύουμε τον κόμβο i στο στοιχείο Τ[i] του πίνακα. Θέλουμε να κάνουμε την αρίθμηση έτσι ώστε να πετύχουμε την εκτέλεση χρήσιμων λειτουργιών στο δένδρο σε σταθερό χρόνο. 1 C 3 G D 4 5 K 6 0 7 8 9 10 11 A B O M Y S 2 i 2i+1 E X Αρίθμηση Η ρίζα είναι ο κόμβος 0. Το αριστερό παιδί του κόμβου i αριθμείται ως κόμβος 2i+1, ενώ το δεξί παιδί του ως κόμβος 2i+2. 0 1 2 3 4 5 6 7 8 9 10 11 Α C E G D K X B O M Y s ΗΥ240 - Παναγιώτα Φατούρου 27

Υλοποίηση Πλήρων Δυαδικών Δένδρων A 0 i 2i+1 1 C E 2 0 1 2 3 4 5 6 7 8 9 10 11 Α C E G D K X B O M Y s 3 G D 4 5 K 6 X Υλοποίηση Λειτουργιών IsLeaf(i): return (2i+1 n); LeftChild(i): if (2i+1 < n) return (2i+1) else return nill; RightChild(i): if (2i+2 < n) return(2i+2); else return nill; LeftSibling(i): if (i!= 0 and i not odd) return (i-1); RightSibling(i): if (i!= n-1 and i not even) return(i+1); Parent(i): if (i!= 0) return( (i-1)/2 ); B O M Y S 7 8 9 10 11 Χρονική πολυπλοκότητα κάθε λειτουργίας: Θ(1) ΗΥ240 - Παναγιώτα Φατούρου 28

Αναφορές Το υλικό της ενότητας αυτής περιέχεται στo βιβλίo: Harry Lewis and Larry Denenberg, Data Structures and Their Algorithms, Harper Collins Publishers, Inc., New York, 1991 Chapter 4: Trees ΗΥ240 - Παναγιώτα Φατούρου 29

Τέλος Ενότητας

Χρηματοδότηση Το παρόν εκπαιδευτικό υλικό έχει αναπτυχθεί στα πλαίσια του εκπαιδευτικού έργου του διδάσκοντα. Το έργο «Ανοικτά Ακαδημαϊκά Μαθήματα στο Πανεπιστήμιο Κρήτης» έχει χρηματοδοτήσει μόνο τη αναδιαμόρφωση του εκπαιδευτικού υλικού. Το έργο υλοποιείται στο πλαίσιο του Επιχειρησιακού Προγράμματος «Εκπαίδευση και Δια Βίου Μάθηση» και συγχρηματοδοτείται από την Ευρωπαϊκή Ένωση (Ευρωπαϊκό Κοινωνικό Ταμείο) και από εθνικούς πόρους.

Σημειώματα

Σημείωμα αδειοδότησης Το παρόν υλικό διατίθεται με τους όρους της άδειας χρήσης Creative Commons Αναφορά Δημιουργού - Μη Εμπορική Χρήση - Παρόμοια Διανομή 4.0 [1] ή μεταγενέστερη, Διεθνής Έκδοση. Εξαιρούνται τα αυτοτελή έργα τρίτων π.χ. φωτογραφίες, διαγράμματα κ.λ.π., τα οποία εμπεριέχονται σε αυτό και τα οποία αναφέρονται μαζί με τους όρους χρήσης τους στο «Σημείωμα Χρήσης Έργων Τρίτων». [1] http://creativecommons.org/licenses/by-nc-nd/4.0/ Ως Μη Εμπορική ορίζεται η χρήση: που δεν περιλαμβάνει άμεσο ή έμμεσο οικονομικό όφελος από την χρήση του έργου, για το διανομέα του έργου και αδειοδόχο που δεν περιλαμβάνει οικονομική συναλλαγή ως προϋπόθεση για τη χρήση ή πρόσβαση στο έργο που δεν προσπορίζει στο διανομέα του έργου και αδειοδόχο έμμεσο οικονομικό όφελος (π.χ. διαφημίσεις) από την προβολή του έργου σε διαδικτυακό τόπο Ο δικαιούχος μπορεί να παρέχει στον αδειοδόχο ξεχωριστή άδεια να χρησιμοποιεί το έργο για εμπορική χρήση, εφόσον αυτό του ζητηθεί..

Σημείωμα Αναφοράς Copyright Πανεπιστήμιο Κρήτης, Παναγιώτα Φατούρου. «Δομές δεδομένων. Ενότητα 3η: Δένδρα». Έκδοση: 1.0. Ηράκλειο/Ρέθυμνο 2013. Διαθέσιμο από τη δικτυακή διεύθυνση: http://www.csd.uoc.gr/~hy240/