5 ΔΕΝΤΡΑ (Trees) Σχήµα 5.1 : ενδροειδής αναπαράσταση αρχείων στα Windows. έντρα. \ {root directory} Accessories. Program Files.



Σχετικά έγγραφα
υαδικό έντρο Αναζήτησης (BSTree)

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

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

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

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

ΠΑΡΑΡΤΗΜΑ: QUIZ ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ

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

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

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

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

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

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

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

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

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

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

1 Εισαγωγή στις οµές εδοµένων 2. 2 Στοίβα (Stack) 4. 3 Ουρά (Queue) 7. 4 Λίστα (List) 9. 5 Συνδεδεµένη Λίστα (Linked List) 14

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Ουρά Προτεραιότητας: Heap

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

έντρα Πολλαπλής ιακλάδωσης και (a, b)- έντρα

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

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

Oι βασικές πράξεις (λειτουργίες) που ορίζονται για τον τύπο στοίβα αναφέρονται παρακάτω:

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

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

Βασικές Έννοιες Δοµών Δεδοµένων

έντρα ιδάσκοντες:. Φωτάκης,. Σούλιου Επιμέλεια διαφανειών:. Φωτάκης Σχολή Ηλεκτρολόγων Μηχανικών και Μηχανικών Υπολογιστών Εθνικό Μετσόβιο Πολυτεχνείο

Συλλογές, Στοίβες και Ουρές

Δοµές Δεδοµένων. Αλγόριθµοι & Πολυπλοκότητα (Χειµώνας 2011) Ουρές Προτεραιότητας 2

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

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

ιδάσκοντες: Φ. Αφράτη,. Φωτάκης,. Σούλιου Επιμέλεια διαφανειών:. Φωτάκης Σχολή Ηλεκτρολόγων Μηχανικών και Μηχανικών Υπολογιστών

Βασικές δοµές δεδοµένων. Ορολογία λιστών. 8.1 Βασικές έννοιες δοµών δεδοµένων 8.2 Υλοποίηση δοµών δεδοµένων 8.3 Μια σύντοµη υπόθεση εργασίας

υαδικά δέντρα αναζήτησης

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

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

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

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

Ουρά Προτεραιότητας: Heap

Ουρές προτεραιότητας

Ουρά Προτεραιότητας: Heap

AVL-trees C++ implementation

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

διεύθυνση πρώτου στοιχείου διεύθυνση i-οστού στοιχείου T t[n]; &t[0] είναι t &t[i] είναι t + i*sizeof(t)

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

Ουρά Προτεραιότητας (priority queue)

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

Σημειώσεις ένατης εβδομάδας

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

Ουρά Προτεραιότητας: Heap

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

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

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

Στοιχεία Θεωρίας Γραφηµάτων (4) - έντρα

ΚΕΦΑΛΑΙΟ 8: Αφαίρεση δεδοµένων

Δομές Δεδομένων. Δημήτρης Μιχαήλ. Υλοποίηση Δυαδικού Σωρού σε γλώσσα Java. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

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

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

Αλγόριθµοι και Πολυπλοκότητα

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

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

Διάλεξη 21η: Απλά Συνδεδεμένες Λίστες

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

Δοµές Δεδοµένων. 14η Διάλεξη Δέντρα Δυαδικής Αναζήτησης. Ε. Μαρκάκης

Διάλεξη 06: Συνδεδεμένες Λίστες & Εφαρμογές Στοιβών και Ουρών

Πελάτες φθάνουν στο ταμείο μιας τράπεζας Eνα μόνο ταμείο είναι ανοικτό Κάθε πελάτης παρουσιάζεται με ένα νούμερο - αριθμός προτεραιότητας Όσο ο

Κεφάλαιο 2. Η δοµή δεδοµένων Σωρός και η Ταξινόµηση Σωρού (The Heap data structure and Heapsort) Έκδοση 1.1, 12/05/2010

8. Σωροί (Heaps)-Αναδρομή- Προχωρημένη Ταξινόμηση

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

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

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

Διάλεξη 15: Αναδρομή (Recursion) Διδάσκων: Παναγιώτης Ανδρέου

Διάλεξη 17: O Αλγόριθμος Ταξινόμησης HeapSort

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

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

Κύρια σηµεία για µελέτη. έντρα. Ορολογία δέντρων. Τι είναι δέντρο

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

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

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

Δομές Δεδομένων - Εργαστήριο 5. Ουρές Προτεραιότητας

#include <stdlib.h> Α. [-128,127] Β. [-127,128] Γ. [-128,128]

Διακριτά Μαθηματικά ΙΙ Χρήστος Νομικός Τμήμα Μηχανικών Η/Υ και Πληροφορικής Πανεπιστήμιο Ιωαννίνων 2018 Χρήστος Νομικός ( Τμήμα Μηχανικών Η/Υ Διακριτά

Εργαστήριο 2 Δυναμικές Δομές Δεδομένων Διδάσκοντες: Δρ. Γεώργιος Δημητρίου Δρ. Άχμεντ Μάχντι

Βασικές Έννοιες Θεωρίας Γραφημάτων

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

Transcript:

5 ΔΕΝΤΡΑ (Trees) Oι περισσότερες δοµές δεδοµένων που εξετάσαµε µέχρι τώρα (λίστες, στοίβες, ουρές) ήταν γραµµικές (ή δοµές δεδοµένων µιας διάστασης). Στην παράγραφο αυτή θα ασχοληθούµε µε τις µή-γραµµικές δοµές δεδοµένων που ονοµάζονται δέντρα. Συναντάµε τα δέντρα σε πάρα πολλές εφαρµογές της επιστήµης των υπολογιστών. Κλασσικό παράδειγµα αποτελεί η οργάνωση του συστήµατος των αρχείων, µε τη µορφή δέντρου (βλέπε σχ. 5.1), που ακολουθούν τα περισσότερα λειτουργικά συστήµατα (π.χ. DOS, UNIX). Tα δέντρα χρησιµοποιούνται επίσης πολύ συχνά, σαν µοντέλα αναπαράστασης προβληµάτων της καθηµερινής µας ζωής. Χαρακτηριστικά παραδείγµατα αποτελούν το "γενεαλογικό" δέντρο και η δενδροειδής αναπαράσταση αγώνων κυπέλου, µεταξύ οµάδων (σχ. 5.2). \ root directory Accessories Program Files MSoffice2000 Autoexec.bat Chkdsk.exe NetMeeting Windows Command.com JavaFiles Readme.txt Programs Program1.java Program2.java Σχήµα 5.1 : ενδροειδής αναπαράσταση αρχείων στα Windows 61

ΑΡΗΣ ΟΛΥΜΠΙΑΚΟΣ ΠΑΟΚ ΟΦΗ ΑΡΗΣ ΟΦΗ ΑΡΗΣ ΗΡΑΚΛΗΣ ΠΑΟ ΟΞΑ AEK ΠΑΟ AEK AEK ΚΥΠΕΛΟΥΧΟΣ Σχήµα 5.2 : Aναπαράσταση αγώνων κυπέλου µε µορφή δέντρου Παρά το γεγονός ότι η έννοια του δέντρου γίνεται έµµεσα κατανοητή από έναν οποιονδήποτε οπτικό τρόπο αναπαράστασης του, η δοµή δεδοµένων δέντρο πρέπει να οριστεί µε έναν αυστηρά µαθηµατικό τρόπο. Yπάρχουν πολλοί ισοδύναµοι ορισµοί ενός δέντρου, δίνουµε στη συνέχεια δύο από αυτούς. Oρισµός 1: Δέντρο (tree) είναι ένα σύνολο T από κόµβους (nodes), τέτοιο ώστε είτε: (α) Tο T είναι κενό ή (β) Tο T περιλαµβάνει ένα ξεχωριστό κόµβο, R, που ονοµάζεται ρίζα (root ) του T και οι υπόλοιποι κόµβοι T - R χωρίζονται σε µηδέν ή περισσότερα σύνολα κόµβων, T1, T2,..., Tn, που είναι ξένα µεταξύ τους και τα οποία είναι µε τη σειρά τους δέντρα. Tα T1, T2,..., Tn, ονοµάζονται υποδέντρα του T. 62

Oρισµός 2: Δέντρο είναι µία συλλογή από στοιχεία, που ονοµάζονται κόµβοι. Oι κόµβοι του δέντρου συνδέονται µεταξύ τους µε τη βοήθεια ακµών (arcs) µε βάση τους εξής κανόνες: (α) Yπάρχει ένας και µόνον ένας κόµβος στον οποίο δεν καταλήγει καµία ακµή (η Pίζα (Root) του δέντρου). (β) Σε όλους τους υπόλοιπους κόµβους καταλήγει υποχρεωτικά µία και µόνο µία ακµή. O πρώτος ορισµός είναι αναδροµικός και είναι καλό να τον έχει κανείς υπ' όψη του, όταν θα συζητήσουµε αργότερα, τις διάφορες ιδιότητες και τους αλγόριθµους επεξεργασίας των δέντρων. O δεύτερος ορισµός βρίσκεται σε µεγαλύτερη αντιστοιχία µε τον οπτικό τρόπο αναπαράστασης ενός δέντρου. Aς εξετάσουµε τους δύο ορισµούς χρησιµοποιώντας για παράδειγµα το δέντρο του σχήµατος 5.3 : A B C D E F G H I J K L M Σχήµα 5.3 : Συνήθης οπτική αναπαράσταση δέντρου Σύµφωνα µε τον δεύτερο ορισµό βλέπουµε ότι µόνο στον κόµβο A, που αποτελεί τη ρίζα του δέντρου δεν καταλήγει καµία ακµή, ενώ σε όλους τους άλλους κόµβους καταλήγει µία µόνο ακµή. Παρατηρήστε ότι συνήθως σχεδιάζουµε ένα δέντρο µε τη 63

ρίζα του επάνω και τους υπόλοιπους κόµβους από κάτω (παρόλο που αυτό µοιάζει παράξενο!). Σύµφωνα µε τον πρώτο ορισµό το δέντρο αποτελείται από ένα σύνολο 13 κόµβων: T = A, B, C, D, E, F, G, H, I, J, K, L, M H ρίζα του είναι A και το σύνολο T - A χωρίζεται σε τρία υποδέντρα: T1 = B, E, F, G, T2 = C, H, I και T3 = D, J, K, L, M Tα T1, T2 και T3 έχουν σαν ρίζα τον κόµβο B, C, και D αντίστοιχα. Tα δε σύνολα T1 - B, T2 - C και T3 - D χωρίζονται αντίστοιχα στα υποδέντρα: T1.1 = E, T1.2 = F, T1.3 = G T2.1 = H, T2.2 = I T3.1 = J, T3.2 = K, T3.3 = L, T3.4 = M Kάθε ένα από τα τελευταία υποδέντρα είναι σύνολα που περιέχουν έναν µόνον κόµβο. O κόµβος αυτός αποτετελεί και τη ρίζα του αντίστοιχου υποδέντρου και αν αφαιρεθεί το σύνολο που προκύπτει είναι το κενό (περίπτωση (α) του ορισµού). Mερικοί ακόµα ορισµοί-ιδιότητες των δέντρων είναι απαραίτητοι: Kάθε κόµβος (εκτός από τη ρίζα) έχει ακριβώς έναν κόµβο από πάνω του, ο οποίος ονοµάζεται πατέρας (father). Για παράδειγµα στο δέντρο του σχήµατος 5.3, ο A είναι ο πατέρας του B και ο D είναι ο πατέρας του K. Oι κόµβοι που βρίσκονται ακριβώς κάτω από έναν κόµβο (συνδέονται µε ακµές που ξεκινούν από αυτόν), ονοµάζονται παιδιά του (children). Πολλές φορές µπορεί να αναφερόµαστε (κατ' αναλογία µε τα γενεαλογικά δέντρα) στους απογόνους (successors) ή προγόνους (ancestors) ενός κόµβου. Στο παράδειγµα του σχήµατος 5.3, οι κόµβοι E, F, G είναι παιδιά του κόµβου B. Oι κόµβοι H και I είναι απόγονοι του A (όχι οι µοναδικοί) και ο κόµβος G έχει πρόγονο τον A. 64

Eνας κόµβος ο οποίος δεν έχει κανένα µη-κενό υποδέντρο (κόµβος χωρίς παιδιά) ονοµάζεται τερµατικός (terminal) κόµβος ή φύλλο (leaf) του δέντρου. Στο δέντρο του σχήµατος 5.3, τερµατικοί κόµβοι είναι οι E, F, G, H, I, J, K, L και M. Oλοι οι υπόλοιποι κόµβοι του δέντρου ονοµάζονται µή-τερµατικοί (nonterminals). Πολλές φορές οι τερµατικοί κόµβοι ενός δέντρου αναφέρονται και σαν εξωτερικοί (externals) ενώ οι µή τερµατικοί σαν εσωτερικοί (internals). Mία ακολουθία κόµβων, ενός δέντρου, οι οποίοι συνδέονται διαδοχικά µεταξύ τους µε τη βοήθεια ακµών, ονοµάζεται µονοπάτι (path). Oι ακολουθίες <A, B, G> και <A, D, K> είναι δύο από τα µονοπάτια του δέντρου του σχήµατος 5.3. Oι κόµβοι ενός δέντρου χωρίζονται σε επίπεδα (levels). Eνας κόµβος βρίσκεται στο επίπεδο N, εάν N είναι ο αριθµός των ακµών του µονοπατιού, που συνδέει τη ρίζα µε τον κόµβο αυτό. Στο παράδειγµα του σχήµατος 5.3, ο A ανήκει στο επίπεδο 0, οι B, C, D ανήκουν στο επίπεδο 1, ενώ οι κόµβοι E, F, G, H, I, J, K, L, M αποτελούν το επίπεδο 2. Oρίζουµε σαν ύψος (heigth) ή βάθος (depth) ενός κόµβου τον αριθµό του επιπέδου στο οποίο βρίσκεται ο κόµβος αυτός. Tο ύψος (ή βάθος) ενός δέντρου ταυτίζεται µε το µέγιστο ύψος (ή βάθος) των κόµβων του δέντρου. Oνοµάζουµε βαθµό (degree) ενός κόµβου τον αριθµό των υποδέντρων του Oνοµάζουµε δάσος (forest) ένα σύνολο από N >= 0 δέντρα που είναι ξένα µεταξύ τους. 65

5.1 Δυαδικά Δέντρα Oρισµός 3: Δυαδικό δέντρο (binary tree) είναι ένα δέντρο του οποίου κάθε κόµβος έχει το πολύ δύο υποδέντρα. Tα υποδέντρα του δυαδικού δέντρου ονοµάζονται αριστερό και δεξιό υποδέντρο αντίστοιχα. D B F A C G E Σχήµα 5.4 : υαδικό δέντρο 5.1.1 Yλοποίηση Δυαδικού Δέντρου µε τη Bοήθεια Δεικτών Mπορούµε να αναπαραστήσουµε ένα δυαδικό δέντρο µε τη βοήθεια µιας δυναµικής δοµής δεδοµένων. Kάθε κόµβος του δέντρου αναπαρίσταται µε τη βοήθεια µιας τριάδας η οποία περιλαµβάνει ένα πεδίο για την αποθήκευση της πληροφορίας του κόµβου και δύο πεδία τύπου δείκτη σε κόµβο δέντρου, που δείχνουν στο αριστερό και δεξιό υποδέντρο αντίστοιχα. Η τριάδα αυτή των δηλώσεων ορίζονται σαν µέλη της κλάσης TreeNode. Δίνεται επίσης στα πλαίσια της κλάσης η πράξη δηµιουργίας ενός τερµατικού κόµβου: 66

class TreeNode TreeNode left; int item; TreeNode right; public TreeNode(int data) item = data; left = right = null;.. Για να αναφερθούµε σε ένα δυαδικό δέντρο χρησιµοποιούµε ένα δείκτη (pointer), ο οποίος δείχνει στην ρίζα του. Ο δείκτης αυτός (root) ορίζεται στα πλαίσια της κλάσης που υλοποιεί το δέντρο αυτό H χρήση δυναµικής δοµής δεδοµένων είναι τις περισσότερες φορές η πιο κατάλληλη για την αναπαράσταση ενός δυαδικού δέντρου και είναι αυτή που θα χρησιµοποιήσουµε για την υλοποίηση των διαφόρων πράξεων-λειτουργιών που ορίζονται πάνω στα δυαδικά δέντρα. Στο σχήµα 5.6 φαίνεται η γραφική αναπαράσταση του δέντρου του σχήµατος 5.4 µε τη βοήθεια δεικτών. Παρατηρήστε ότι στην περίπτωση που το αριστερό ή το δεξιό υποδέντρο ενός κόµβου είναι κενό τότε η αντίστοιχη τιµή του δείκτη left ή right έχει την τιµή null. 67

Root D Root.left Root.right B F A C null G null null G null null null null null Σχήµα 5.6: Aναπαράσταση δυαδικού δέντρου µε τη βοήθεια δεικτών 5.2 Bασικές Mέθοδοι Διέλευσης από τους Kόµβους ενός Δυαδικού Δέντρου Oι περισσότεροι αλγόριθµοι χειρισµού δυαδικών δέντρων απαιτούν ένα συστηµατικό τρόπο "επίσκεψης", όλων των κόµβων του δέντρου. Oι κυριότεροι τρόποι επίσκεψης είναι τρεις και περιγράφονται στη συνέχεια. Έστω για παράδειγµα το δυαδικό δέντρο του παρακάτω σχήµατος: 68

D B F A C E G 1ος τρόπος: Eνθεµατική Διέλευση (Inorder Traversal ) Bήµα 1 : Διέλευση Aριστερού υποδέντρου Bήµα 2 : Eπίσκεψη ρίζας Bήµα 3 : Διέλευση Δεξιού υποδέντρου Για το δέντρο του παράδειγµατος έχουµε: A B C D E F G Η παρακάτω αναδροµική µέθοδος της κλάσης BSTree (βλέπε και τµήµα κώδικα 1) υλοποιεί την ενθεµατική διέλευση από τους κόµβους ενός δυαδικού δέντρου. Στην περίπτωση που ο αλγόριθµος επισκέπτεται έναν κόµβο το περιεχόµενό του τυπώνεται στην οθόνη: private void inorder(treenode node) if (node == null) return; inorder(node.left); System.out.print(node.item + " "); inorder(node.right); 2ος τρόπος: Προθεµατική Διέλευση (Preorder Traversal) Bήµα 1 : Eπίσκεψη ρίζας Bήµα 2 : Διέλευση Aριστερού υποδέντρου Bήµα 3 : Διέλευση Δεξιού υποδέντρου 69

Για το δέντρο του παράδειγµατος έχουµε: D B A C F E G Η υλοποίηση της αναδροµικής µεθόδου preorder είναι η εξής: private void preorder(treenode node) if (node == null) return; System.out.print(node.item + " "); preorder(node.left); preorder(node.right); 3ος τρόπος: Eπιθεµατική Διέλευση (Postorder Traversal) Bήµα 1 : Διέλευση Aριστερού υποδέντρου Bήµα 2 : Διέλευση Δεξιού υποδέντρου Bήµα 3 : Eπίσκεψη ρίζας Για το δέντρο του παράδειγµατος έχουµε: A C B E G F D Η υλοποίηση της αναδροµικής µεθόδου postorder είναι η εξής: private void postorder(treenode node) if (node == null) return; postorder(node.left); postorder(node.right); System.out.print(node.item + " "); 70

5.3 Kατασκευή Δυαδικού Δέντρου Aναζήτησης Το δυαδικό δέντρο αναζήτησης αποτελεί µία ειδική κατηγορία δυαδικού δέντρου, το οποίο κατασκευάζεται µε βάση τον παρακάτω αλγόριθµο. BHMA 1: Tο πρώτο δεδοµένο χρησιµοποιείται για τη δηµιουργία της ρίζας του δέντρου. BHMA 2: Tα επόµενα δεδοµένα τοποθετούνται στο δέντρο, έτσι ώστε σε σχέση µε οποιονδήποτε κόµβο να ισχύει το εξής: Oλες οι τιµές που βρίσκονται στο αριστερό υποδέντρο είναι µικρότερες από την τιµή του κόµβου και όλες οι τιµές που βρίσκονται στο δεξιό υποδέντρο είναι µεγαλύτερες. Mε βάση τα βήµατα 1 και 2 ορίζεται η παρακάτω πράξη εισαγωγής στοιχείου σε ένα δυαδικό δέντρο: public void insertnode(int d) if (root == null) root = new TreeNode(d); else root.insert(d); public void insert(int d) if (d < item) if (left == null) left = new TreeNode(d); else left.insert(d); else if (right == null) right = new TreeNode(d); else right.insert(d); 71

Η µέθοδος insertnode ανήκει στην κλάση BSTree ενώ η µέθοδος insert είναι µέθοδος της κλάσης TreeNode. H επαναληπτική χρησιµοποίηση της insertnode (για την εισαγωγή µιας ακολουθίας δεδοµένων) δηµιουργεί το δυαδικό δέντρο αναζήτησης. Eνα τέτοιο δέντρο αποτελεί µία δοµή καταχώρησης πληροφορίας µε ταξινοµηµένο τρόπο. Mπορούµε εύκολα να παρατηρήσουµε ότι, εάν εφαρµόσουµε τον ενθεµατικό τρόπο διέλευσης από τους κόµβους ενός δυαδικού δέντρου αναζήτησης τα περιεχόµενα των κόµβων θα εκτυπωθούν σε αύξουσα τάξη. Ολόκληρη η υλοποίηση ενός κόµβου δυαδικού δέντρου καθώς και η υλοποίηση του δυαδικού δέντρου αναζήτησης δίνεται στα τµήµατα κώδικα 1 και 2 αντίστοιχα. class TreeNode //Ορισµός κόµβου ενός υαδικού έντρου TreeNode left; int item; TreeNode right; public TreeNode(int data) item = data; left = right = null; public void insert(int d) if (d < item) if (left == null) left = new TreeNode(d); else left.insert(d); else if (right == null) right = new TreeNode(d); else right.insert(d); Τµήµα Κώδικα 1: Κόµβος υαδικού έντρου 72

import java.io.*; public class BSTree //Υλοποίηση ενός υαδικού έντρου Αναζήτησης TreeNode root; public BSTree( ) root = null; public void insertnode(int d) if (root == null) root = new TreeNode(d); else root.insert(d); public void inordertraversal( ) inorder(root); private void inorder(treenode node) if (node == null) return; inorder(node.left); System.out.print(node.item + " "); inorder(node.right); Τµήµα Κώδικα 2: υαδικό έντρο Αναζήτησης ( Α) Στο τµήµα κώδικα 3 φαίνεται πως µπορεί να χρησιµοποιηθεί το δυαδικό δέντρο αναζήτησης για την ταξινόµηση ενός πίνακα. Αν τροποποιήσουµε την inordertraversal που δόθηκε στα τµήµατα κώδικα 1 και 2 κατάλληλα, µπορούµε αντί της εµφάνισης των δεδοµένων στην οθόνη να τα τοποθετούµενα ξανά στον πίνακα. 73

public class BSTreeSort public static void main (String args[ ]) BSTree BT = new BSTree(); int A[ ] = 47, 12, 19, 50, 17, 10, 69, 54, 42, 8; for (int i = 0; i < A.length; i++) BT.insertNode(A[i]); BT.inOrderTraversal( ); Τµήµα Κώδικα 3: Ταξινόµηση µε τη βοήθεια Α 74

5.4 Yλοποίηση Σωρού (Heap ) µε τη βοήθεια Δυαδικού Δέντρου Ένα δυαδικό δέντρο βάθους N ονοµάζεται πλήρες (complete) όταν έχει όλους τους κόµβους του επιπέδου N συµπληρωµένους. Ένα δυαδικό δέντρο βάθους N ονοµάζεται σχεδόν πλήρες (almost complete) όταν έχει όλους τους κόµβους του επιπέδου N-1 συµπληρωµένους και οι κόµβοι που υπάρχουν στο N-οστό επίπεδο είναι τοποθετηµένοι όσο το δυνατόν πιο αριστερά. Η τοποθέτηση των κόµβων σε ένα σχεδόν πλήρες δυαδικό δέντρο είναι τέτοια που µας επιτρέπει να αριθµήσουµε µε ένα συστηµατικό τρόπο τους κόµβους αυτούς. Αυτή η συστηµατική αρίθµηση (από πάνω προς τα κάτω και από αριστερά προς τα δεξιά κάνει δυνατή την αναπαράσταση ενός σχεδόν πλήρους δυαδικού δέντρου µε τη βοήθεια ενός απλού γραµµικού πίνακα, όπως φαίνεται στο σχήµα 5.7. (Θεωρούµε ότι το στοιχείο µε ενδείκτη 0 του πίνακα δεν χρησιµοποιείται) 1 D 2 3 A C 4 5 6 7 B F E G 8 9 10 H I J D A C B F E G H I J 1 2 3 4 5 6 7 8 9 10 Σχήµα 5.7: Aναπαράσταση σχεδόν πλήρους δυαδικού δέντρου µε πίνακα 75

Ένα δυαδικό δέντρο ονοµάζεται σωρός (heap) όταν ισχύουν επιπλέον οι παρακάτω δύο προϋποθέσεις: (α) το δυαδικό δέντρο είναι σχεδόν πλήρες και (β) οι τιµές των κόµβων είναι τοποθετηµένες µε τέτοιο τρόπο ώστε ο κάθε κόµβος πατέρας να έχει µεγαλύτερη τιµή από τα παιδιά του. Οι βασικές πράξεις που ορίζονται για τη δοµή δεδοµένων σωρός, είναι η πράξη της εισαγωγής και η πράξη της διαγραφής ενός στοιχείου. Η πράξη της εισαγωγής φροντίζει ώστε ο σωρός που προκύπτει να έχει το µεγαλύτερο στοιχείο του πάντοτε στην κορυφή του δέντρου (κορυφή του σωρού). Στο σχήµα 5.9 φαίνεται µία σειρά από διαδοχικές πράξεις εισαγωγής στοιχείων οι οποίες δηµιουργούν ένα σωρό. Η πράξη διαγραφής αφαιρεί πάντοτε το στοιχείο που βρίσκεται στην κορυφή του δέντρου και φροντίζει να αναδιατάσσει το δέντρο, έτσι ώστε το αµέσως µεγαλύτερο στοιχείο να βρεθεί στην κορυφή του σωρού. Η κλάση Heap που υλοποιεί το σωρό δίνεται στο τµήµα κώδικα 3. public class Heap /* Ενδεικτική Υλοποίηση */ private int[ ] btree; private int index; private int capacity; public Heap(int cap) capacity = cap; btree = new int[capacity]; index = 0; public void heapinsert(int item) int father, son; son = ++index; btree[son] = item; // αρχικά το item στο τέλος της heap 76

father = son/2; while( (son>1) && (btrre[son]>btree[father]) ) int b = btree[father]; btree[father] = btree[son]; btree[son] = b; son = father; father = son/2; public int heapdelete( ) int father, son; int olditem, p; olditem = btree[index]; btree[index] = btree[1]; p = btree[1]; index--; father = 1; if ( (index > 2) && (btree[2] > btree[3]) ) son = 2; else son = 3; while ( (son <= index) && (btree[son] > olditem) ) btree[father] = btree[son]; father = son; son = father * 2; if ( ( son+1 <= index) && (btree[son+1] > btree[son]) ) son = son +1; btree[father] = olditem; return p; Τµήµα Κώδικα 4 77

5 5 60 60 60 5 5 10 60 60 60 5 10 35 10 35 10 35 5 5 20 60 60 65 35 10 35 65 35 60 5 20 65 5 20 10 5 20 10 Σχήµα 5.9: Διαδικασία εισαγωγής στοιχείων σε ένα σωρό 78