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



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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Insert(K,I,S) Delete(K,S)

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

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

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

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

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

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

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

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

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

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

Αφηρημένες Δομές Δεδομένων. Στοίβα (Stack) Υλοποίηση στοίβας

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

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

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

Δημιουργία Δυαδικών Δέντρων Αναζήτησης

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

ΕΝΟΤΗΤΑ 6 ΛΙΣΤΕΣ ΠΑΡΑΛΕΙΨΗΣ (SKIP LISTS)

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

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

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

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

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

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

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

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

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

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

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

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

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

6η Διάλεξη Διάσχιση Γράφων και Δέντρων

ΕΝΟΤΗΤΑ 7 ΟΥΡΕΣ ΠΡΟΤΕΡΑΙΟΤΗΤΑΣ ΣΩΡΟΙ

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

Δομές Δεδομένων. Ενότητα 9: Τα ΔΔΑ ως Αναδρομικές Δομές Δεδομένων-Εφαρμογή Δυαδικών Δέντρων: Κωδικοί Huffman. Καθηγήτρια Μαρία Σατρατζέμη

ΕΠΛ 231 οµές εδοµένων και Αλγόριθµοι Άννα Φιλίππου,

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

ΕΝΟΤΗΤΑ 5 ΣΥΝΟΛΑ - ΛΕΞΙΚΑ. ΗΥ240 - Παναγιώτα Φατούρου 1

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

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

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

ΕΠΛ 231 Δοµές Δεδοµένων και Αλγόριθµοι 8-1

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

AVL-trees C++ implementation

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

Βασικές Δοµές Δεδοµένων. Σύντοµη επανάληψη (ΕΠΛ 035).

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

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

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

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

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

αντικειµένων/στοιχείων (π.χ., σύνολα αριθµών, λέξεων, ζευγών

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

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

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

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

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

Transcript:

ΕΝΟΤΗΤΑ 4 ΕΝ ΡΑ 1

ένδρα εσωτερικός κόµβος u το δένδρο έχει ύψος 4 u έχει ύψος 3 w έχει βάθος 2 κόµβος ένδρο: γράφηµα χωρίς κύκλους o Ρίζα (root) o Κόµβος (node) o Ακµή (edge) o Γονέας (parent) Παιδί (child) Αδελφικός κόµβος (sibling) o Μονοπάτι ή ιαδροµή (path) µήκος µονοπατιού = πλήθος ακµών o Πρόγονος (ancestor) Απόγονος (descendant) o Φύλλο (leaf) Εσωτερικός Κόµβος (non-leaf) o Υποδένδρο ή Υπόδενδρο (subtree) o άσος (forest) = σύνολο από δέντρα 2

Βαθµός Κόµβου (node degree) το πλήθος των παιδιών του κόµβου (Σε δένδρα χωρίς ρίζα: πλήθος γειτόνων του κόµβου) Βαθµός ένδρου (tree degree) µέγιστος βαθµός των κόµβων του δένδρου Επίπεδο (level) Σύνολο από κόµβους: η ρίζα βρίσκεται στο επίπεδο 0. ένας κόµβος w ανήκει στο επίπεδο k ανν το µονοπάτι από τη ρίζα έως τον w έχει µήκος k Ύψος Κόµβου (node height) µήκος µακρύτερου µονοπατιού από τον κόµβο σε κάποιο φύλλο-απόγονο Ύψος ένδρου (tree height) το ύψος της ρίζας του δέντρου (=µέγιστο ύψος µεταξύ των κόµβων του δένδρου) Βάθος Κόµβου (node depth) µήκος µονοπατιού από τη ρίζα στον κόµβο Βάθος ένδρου (tree depth) µέγιστο βάθος µεταξύ των κόµβων του δένδρου 3

Αναδροµικός Ορισµός Ένα δένδρο Τ είναι ένα πεπερασµένο σύνολο µε κανέναν, έναν ή περισσότερους κόµβους: Κανείς κόµβος αποτελεί το κενό δυαδικό δένδρο (δεν υπάρχει καµία ακµή). Ένας µόνο κόµβος (χωρίς καµία ακµή) αποτελεί ένα δένδρο. Ο κόµβος αυτός είναι και ρίζα του δένδρου. Έστω Τ 1,..., Τ κ (κ > 0) δένδρα που δεν έχουν κοινούς κόµβους και έστω r 1,..., r k οι ρίζες τους. Έστω r ένας νέος κόµβος. Αν το Τ αποτελείται από τους κόµβους και τις ακµές των Τ 1, Τ 2,..., Τ κ, τον νέο κόµβο r και τις νέες ακµές <r,r 1 >, <r,r 2 >,, <r,r k >, τότε το Τ είναι δένδρο. Ο κόµβος r είναι η ρίζα του Τ. 4

Είδη ένδρων ιατεταγµένο ένδρο (ordered tree) έχει οριστεί µια διάταξη στα παιδιά κάθε κόµβου υαδικό δένδρο (binary tree) ιατεταγµένο δένδρο στο οποίο κάθε κόµβος έχει το πολύ 2 παιδιά (ένα αριστερό και ένα δεξί). Αναδροµικός Ορισµός o Ένα κενό δέντρο (χωρίς κόµβους) είναι δυαδικό δένδρο (ύψους 0) o Ένας κόµβος (η ρίζα) και 2 δυαδικά δένδρα (ενδεχοµένως κενά) ως αριστερό και δεξί παιδί του αποτελούν ένα δυαδικό δένδρο. 5

Είδη και Ιδιότητες υαδικών ένδρων Γεµάτο υαδικό ένδρο (full binary tree) κάθε κόµβος έχει 2 ή 0 παιδιά κάθε εσωτερικός κόµβος έχει 2 παιδιά Ιδιότητα Κάθε γεµάτο δυαδικό δέντρο µε k φύλλα έχει k-1 εσωτερικούς κόµβους. Απόδειξη Έστω m το πλήθος εσωτερικών κόµβων, δηλ., πλήθος κόµβων = m + k Επειδή κάθε εσωτ. κόµβος έχει ακριβώς δύο παιδιά και τα φύλλα δεν έχουν παιδιά, ενώ η ρίζα δεν είναι παιδί κάποιου κόµβου: Άρα: πλήθος κόµβων = 2 * m + 1 2 * m + 1 = m + k m = k - 1 6

Είδη και Ιδιότητες υαδικών ένδρων Τέλειο υαδικό ένδρο (perfect binary tree) Γεµάτο δυαδικό δένδρο στο οποίο όλα τα φύλλα έχουν το ίδιο βάθος. Προτάσεις (από πρόταση που ακολουθεί) Το ύψος ενός τέλειου δυαδικού δένδρου µε n κόµβους είναι log 2 (n+1) - 1. Το ύψος δυαδικού δένδρου µε n κόµβους είναι log 2 (n+1) 1 = Θ(log 2 n). Πρόταση Ένα τέλειο δυαδικό δένδρο ύψους h έχει 2 h+1 1 κόµβους, εκ των οποίων 2 h είναι φύλλα και 2 h 1 είναι εσωτερικοί κόµβοι. Απόδειξη Με επαγωγή στο h χρησιµοποιώντας τον αναδροµικό ορισµό των δένδρων. 7

Βάση επαγωγής: h = 0 Τέλειο δυαδικό δένδρο ύψους 0: 1 κόµβος-φύλλο 2 h+1 1 = 2 0+1 1 = 2 1 = 1 κόµβος 2 h = 2 0 = 1 φύλλο & 2 h 1 = 0 εσωτ. κόµβοι Επαγωγική Υπόθεση Έστω ότι ένα τέλειο δυαδικό δένδρο ύψους κ έχει 2 κ+1 1 κόµβους, εκ των οποίων 2 κ είναι φύλλα και 2 κ 1 είναι εσωτερικοί κόµβοι, κ >= 0. Επαγωγικό βήµα: Θα δείξουµε ότι ο ισχυρισµός είναι σωστός για δένδρα ύψους κ+1. Ένα τέλειο δένδρο Τ ύψους κ+1 αποτελείται από τη ρίζα του και 2 τέλεια δένδρα ύψους κ. Από την Επαγωγική Υπόθεση, καθένα από αυτά τα δέντρα έχει 2 κ+1 1 κόµβους, εκ των οποίων 2 κ είναι φύλλα και 2 κ 1 είναι εσωτερικοί κόµβοι. Άρα το Τ έχει 1 + 2 * (2 κ+1 1) κόµβους = 2 κ+2 1 κόµβους εκ των οποίων 2 κ + 2 κ = 2 κ+1 φύλλα και 2 * (2 κ 1) + 1 = 2 κ+1 1 εσωτερ. κόµβους Αποδείξαµε το Επαγωγικό Βήµα και άρα η πρόταση ισχύει για τέλεια δυαδικά δένδρα οποιουδήποτε ύψους (= κάθε τέλειο δυαδ. δένδρο) 8

Είδη και Ιδιότητες υαδικών ένδρων Πλήρες (complete) υαδικό ένδρο Ύψους h ένα τέλειο δυαδικό δένδρο ύψους h-1 στο οποίο έχουν προστεθεί ένα ή περισσότερα φύλλα µε ύψος h. Τα φύλλα αυτά έχουν τοποθετηθεί στις αριστερότερες θέσεις του δένδρου. Αναδροµικός Ορισµός o Ένα πλήρες δυαδικό δένδρο ύψους 0 αποτελείται από 1 µόνο κόµβο. o Ένα πλήρες δυαδικό δένδρο ύψους 1 είναι ένα δένδρο ύψους 1 στο οποίο η ρίζα έχει είτε 2 παιδιά ή ένα µόνο αριστερό παιδί. o Ένα πλήρες δυαδικό δένδρο ύψους h>1 αποτελείται από µια ρίζα και 2 υποδένδρα τ.ω: το αριστερό υποδένδρο είναι πλήρες ύψους h-1 και το δεξιό είναι τέλειο ύψους h-2 ή είτε το αριστερό υποδένδρο είναι τέλειο ύψους h-1 και το δεξιό είναι πλήρες ύψους h-1. 9

Λειτουργίες σε ένδρα Parent(v): επιστρέφει (δείκτη) στον κόµβο-γονέα του v ή NULL αν ο v είναι η ρίζα Children(v): επιστρέφει το σύνολο των παιδιών του v ή το κενό σύνολο αν ο v είναι φύλλο LeftChild(v), RightChild(v): (σε δυαδικά δένδρα) επιστρέφει (δείκτη) στο αριστερό / δεξί παιδί του v ή NULL εάν αυτό δεν υπάρχει FirstChild(v): επιστρέφει (δείκτη) στο πρώτο παιδί του v ή NULL αν ο v δεν έχει παιδιά RightSibling(v): επιστρέφει (δείκτη) στον δεξιό αδελφικό κόµβο του v ή NULL αν ο v είναι η ρίζα ή το δεξιότερο παιδί του κόµβου-γονέα του LeftSibling(v): επιστρέφει (δείκτη) στον αριστερό αδελφικό κόµβο του v ή NULL αν ο v είναι η ρίζα ή το αριστερότερο παιδί του κόµβου-γονέα του IsLeaf(v): επιστρέφει true αν ο v είναι φύλλο, false διαφορετικά Depth(v): επιστρέφει το βάθος του v στο δένδρο Height(v): επιστρέφει το ύψος του v στο δένδρο 10

Υλοποίηση ένδρων Υλοποίηση υαδικών ένδρων Κάθε κόµβος έχει ένα πεδίο δεδοµένων data τύπου Info και 2 δείκτες left και right που δείχνουν στο αριστερό και στο δεξί παιδί του κόµβου, αντίστοιχα. Οι λειτουργίες LeftChild(v) και RightChild(v) υλοποιούνται πολύ εύκολα σε Θ(1) χρόνο. Είναι αυτό αλήθεια για τη λειτουργία Parent(v)? Αποδοτική Υλοποίηση της Parent() Με χρήση τρίτου δείκτη σε κάθε κόµβο που δείχνει στον κόµβο-γονέα του («ιπλά Συνδεδεµένο» δένδρο). 11

ιάσχιση ένδρων process(r): διαδικασία για (κάποιου είδους) επεξεργασία του κόµβου στον οποίο δείχνει ο δείκτης r Προδιατεταγµένη ιάσχιση: Επεξεργασία της ρίζας Επίσκεψη του αριστερού υποδένδρου Επίσκεψη του δεξιού υποδένδρου procedure Preorder(pointer r): /* r!= NULL */ /* preorder διάσχιση δυαδικού (υπο)δέντρου µε ρίζα r */ process(r); if (r->left!= NULL) then Preorder(r->left); if (r->right!= NULL) then Preorder(r->right); Οι αριθµοί δηλώνουν τη σειρά επεξεργασίας των κόµβων. 12

ιάσχιση ένδρων Μεταδιατεταγµένη ιάσχιση: Επίσκεψη του αριστερού υποδένδρου Επίσκεψη του δεξιού υποδένδρου Επεξεργασία της ρίζας procedure Postorder(pointer r): /* r!= NULL */ /* postorder διάσχιση δυαδικού (υπο)δέντρου µε ρίζα r */ if (r->left!= NULL) then Postorder(r->left); if (r->right!= NULL) then Postorder(r->right); process(r); Οι αριθµοί δηλώνουν τη σειρά επεξεργασίας των κόµβων. 13

ιάσχιση ένδρων Ενδοδιατεταγµένη ιάσχιση: Επίσκεψη του αριστερού υποδένδρου Επεξεργασία της ρίζας Επίσκεψη του δεξιού υποδένδρου procedure Inorder(pointer r): /* inorder διάσχιση δυαδικού (υπο)δέντρου µε ρίζα r */ if (r == NULL) then return else Inorder(r->left); process(r); Inorder(r->right); 7 10 9 11 Οι αριθµοί δηλώνουν τη σειρά επεξεργασίας των κόµβων. 8 14

ιάσχιση ένδρων Μνηµονικός Κανόνας Στην προδιατεταγµένη διάσχιση επεξεργαζόµαστε τον κόµβο πριν από τα παιδιά του, στη µεταδιατεταγµένη διάσχιση επεξεργαζόµαστε τον κόµβο µετά από τα παιδιά του και στην ενδοδιατεταγµένη διάσχιση επεξεργαζόµαστε τον κόµβο µεταξύ των παιδιών του. Υλοποίηση (Ο(n) χρόνος, n: πλήθος κόµβων) µε αναδροµή (όπως περιγράφηκε) βάθος αναδροµής = ύψος δένδρου συνολικό πλήθος αναδρ. κλήσεων = Ο(n) µε χρήση στοίβας (µεγέθους Ο(n)) 15

Εφαρµογή Μεταδιατεταγµένης ιάσχισης: ένδρα Αριθµητικών Εκφράσεων Υπολογισµός Αριθµητικής Έκφρασης Label(v): ο αριθµός ή η πράξη που αποθηκεύεται στον v ApplyOp(op: operation, x,y: numbers): υπολογίζει την τιµή x <op> y, ανάλογα µε το τι είναι ο δυαδικός τελεστής (πράξη) op. function Evaluate(pointer r): integer /* επιστρέφει την τιµή της αριθµητικής έκφρασης που αποθηκεύεται στο (υπο)δέντρο µε ρίζα r */ if IsLeaf(r) then return Label(r) else x_l = Evaluate(LeftChild(r)) x_r = Evaluate(RightChild(r)) op = Label(r) return ApplyOp(op, x_l, x_r) Σηµ.: Η συνάρτηση βασίζεται στον αναδροµικό ορισµό του δυαδικού δέντρου! 16

ιάσχιση ένδρων ιάσχιση ένδρου κατά Επίπεδα (κατά πλάτος) Επισκέπτεται τους κόµβους κατά αύξον βάθος και τους κόµβους του ίδιου επιπέδου από τα αριστερά προς τα δεξιά. 17

Υλοποίηση ιάσχισης κατά Επίπεδα Με χρήση Ουράς Αρχικά η ουρά περιέχει µόνο τη ρίζα. Στη συνέχεια επαναληπτικά: κάνουµε Dequeue έναν κόµβο από την ουρά και κάνουµε Enqueue τα παιδιά (από αριστερά προς τα δεξιά) του κόµβου αυτού. Παράδειγµα Περιεχόµενα Ουράς Α 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 <κενή> 18

Υλοποίηση ιατεταγµένων ένδρων Μπορούµε να απεικονίσουµε ένα διατεταγµένο δέντρο µε κόµβους που έχουν οσαδήποτε παιδιά σε ένα δυαδικό δέντρο µε χρήση δεικτών: FirstChild() RightSibling() (αριστερότερο παιδί) (αδελφικός κόµβος) εν έχουµε απώλεια πληροφορίας. Ύψος δυαδικού σε σχέση µε το αρχικό δένδρο? Πολυπλοκότητα FirstChild(), RightSibling(): Θ(1) χρόνο K th -child(j,v) για εύρεση j-οστού παιδιού του v: Θ(j) χρόνο. H Parent() δεν υποστηρίζεται αποδοτικά. Ένα δυαδικό δένδρο µπορεί να απεικονίσει και ένα δάσος από διατεταγµένα δένδρα (δεξιός αδελφικός κόµβος ρίζας = η ρίζα του επόµενου δένδρου στο δάσος) 19

Αποθήκευση Πλήρων υαδικών ένδρων Ένα πλήρες δυαδικό δένδρο µε n κόµβους το υλοποιούµε µε έναν πίνακα n στοιχείων. Αντιστοίχιση κόµβων µε τους αριθµούς 0...n-1: κατά επίπεδο και από αριστερά προς τα δεξιά σε κάθε επίπεδο και ο κόµβος µε αριθµό i αποθηκεύεται στο στοιχείο Τ[i] του πίνακα. Έτσι: Η ρίζα είναι ο κόµβος 0. Το αριστερό παιδί του κόµβου i λαµβάνει τον αριθµό 2i+1, ενώ το δεξί παιδί του τον αριθµό 2i+2 πατέρας κόµβου i έχει αριθµό (i-1)/2 Υλοποίηση Λειτουργιών IsLeaf(i): return (2i+1>=n); LeftChild(i): RightChild(i): Parent(i): if (2i+1 < n) return(2i+1); else return(-1); if (2i+2<n) return(2i+2); else return(-1); if (i > 0) return( (i-1)/2 ); else return(-1); LeftSibling(i): if (i!= 0 && i ζυγός αριθµός) return(i-1); else return(-1); RightSibling(i): if (i!= n-1 && i µονός αριθµ.) return(i+1); else return(-1); Σηµ.: επιστρεφόµενη τιµή -1 δεν υπάρχει τέτοιος κόµβος Πολυπλοκότητα Χρόνου κάθε λειτουργίας: Θ(1) 20

υαδικά ένδρα Αναζήτησης (binary search trees) υαδικά δένδρα οι κόµβοι των οποίων αποθηκεύουν τιµές (από ένα διατεταγµένο σύνολο) όπου: σε κάθε κόµβο η τιµή είναι µεγαλύτερη από όλες τις τιµές των κόµβων του αριστερού υποδένδρου και µικρότερη από όλες τις τιµές των κόµβων του δεξιού υποδένδρου. Προσοχή: αυτό δεν σηµαίνει ότι όλες οι τιµές στο δένδρο που είναι µικρότερες από την τιµή σε κάποιον κόµβο βρίσκονται στο αριστερό υποδένδρο αυτού του κόµβου. Ποια η σχέση δυαδικών δένδρων αναζήτησης και ενδοδιατεταγµένης διάσχισης? Κάθε κόµβος είναι µια δοµή µε πεδία key, data, left, right. 21

υαδικό ένδρο Αναζήτησης: Αναζήτηση Αναδροµική Έκδοση function BinSearchTreeLookUp(key k, pointer r) : pointer /* Εύρεση του κόµβου µε κλειδί k στο (υπο)δένδρο µε ρίζα r (µε αναδροµική αναζήτηση) και επιστροφή δείκτη στον κόµβο αυτό ή NULL αν το κλειδί δεν υπάρχει στο δένδρο */ if (r == NULL) return(null); else if (k == r->key) return(r); else if (k < r->key) return(binsearchtreelookup(k, r->left)); else return(binsearchtreelookup(k, r->right)); Μη-Αναδροµική Έκδοση function BinSearchTreeLookUp(key k, pointer r) : pointer while (r!= NULL) { if (k == r->key) return(r); else if (k < r->key) r = r->left; else r = r->right; } return(null); Πολυπλοκότητα χρόνου? Κόµβος Φρουρός? 22

Ελάχιστο και Μέγιστο Στοιχείο function BinSearchTreeMinimum(pointer r) : pointer /* εύρεση κόµβου µε ελάχιστη τιµή κλειδιού στο (υπο)δένδρο µε ρίζα r */ if (r == NULL) return error; while (r ->left!= NULL) r = r ->left; return(r); function BinSearchTreeMaximum(pointer r) : pointer /* εύρεση κόµβου µε µέγιστη τιµή κλειδιού στο (υπο)δένδρο µε ρίζα r */ if (r == NULL) return error; while (r ->right!= NULL) r = r ->right; return(r); Πολυπλοκότητα? Επόµενο και Προηγούµενο Στοιχείο Το πρόβληµα είναι ίδιο µε την εύρεση του επόµενου και προηγούµενου κόµβου στην ενδο-διατεταγµένη διάσχιση του δένδρου. 23

υαδικό ένδρο Αναζήτησης: Εισαγωγή function BinSearchTreeInsert(key k, info d, pointer r) : pointer /*εισαγωγή τιµής κλειδιού k και δεδοµένων d σε δυαδικό δένδρο αναζήτησης µε ρίζα r. Επιστρέφει τη ρίζα */ pointer p, q, prev = NULL; p = r; while (p!= NULL) { if (p->key == k) /* η τιµή κλειδιού βρέθηκε */ { p->data = d; /* καταχώριση δεδοµένων d */ return r; } prev = p; if (k < p->key) p = p->left; else p = p->right; } q = new_struct(node); /* δηµιουργία νέου κόµβου */ q->key = k; q->data = d; q->left = q->right = NULL; /* σύνδεση νέου κόµβου */ if (prev == NULL) return q; /*1 ος κόµβος = ρίζα*/ else if (k < prev->key) prev->left = q; /* ως αριστερό παιδί */ else prev->right = q; /* ως δεξί παιδί */ return r; Οι νέοι κόµβοι εισάγονται πάντα ως φύλλα. Εισάγονται ως παιδιά κόµβου µε το πολύ ένα παιδί. 24

υαδικό ένδρο Αναζήτησης: ιαγραφή Μετά τη διαγραφή, η διάταξη των υπόλοιπων κλειδιών κατά την ενδο-διατεταγµένη διάσχιση πρέπει να διατηρείται. διαγραφή του N αρχικό δένδρο διαγραφή του Μ διαγραφή του F Περιπτώσεις: 1) Ο προς διαγραφή κόµβος είναι φύλλο: απλά τον διαγράφουµε. 2) Ο προς διαγραφή κόµβος είναι εσωτερικός αλλά έχει µόνο ένα παιδί: αντικαθιστούµε τον κόµβο µε το µοναδικό παιδί του. 3) Ο προς διαγραφή κόµβος είναι εσωτερικός µε 2 παιδιά: αντικαθιστούµε τον κόµβο µε τον επόµενό του (προσοχή: σε κάποια συγγράµµατα, προηγούµενό του) στην ενδο-διατεταγµένη διάσχιση. 25

ιαγραφή σε υαδικό ένδρο Αναζήτησης Παράδειγµα: ιαγραφές των 13, 16 και 5 από το αρχικό δένδρο. 26

υαδικό ένδρο Αναζήτησης: ιαγραφή function BinarySearchTreeDelete(pointer r, pointer z) : pointer /* r: δείκτης στη ρίζα -- z : δείκτης στον προς διαγραφή κόµβο */ /* επιστρέφει δείκτη στη ρίζα του δένδρου µετά τη διαγραφή */ pointer x, y; if (z->left == NULL z->right == NULL) y = z; else{ y = TreeSuccessor(z); z->key = y->key; + αντιγραφή τυχόν άλλων πεδίων δεδοµένων; } /* θα διαγραφεί ο κόµβος που δείχνεται από τον δείκτη y */ /* έστω parent δείκτης στον κόµβο-γονέα του κόµβου y */ if (y->left!= NULL) x = y->left; else x = y->right; if (parent == NULL) r = x; /* νέα ρίζα */ else if (y == parent->left) parent->left = x; else parent->right = x; free(y); /* εάν έχει γίνει δυναµική δέσµευση */ return r; 27

υαδικό ένδρο Αναζήτησης: ιαγραφή Γιατί ο επόµενος και όχι ο προηγούµενος στην ενδοδιατεταγµένη διάσχιση? Ποιο πρόβληµα µπορεί να προκύψει µε συνεχή αντικατάσταση του κόµβου µε τον επόµενό του στην ενδο-διατεταγµένη διάσχιση? υαδικό ένδρο Αναζήτησης µε Κόµβο Φρουρό 28

Νηµατικά υαδικά ένδρα Σε ένα δυαδικό δένδρο, περισσότεροι από τους µισούς δείκτες έχουν την τιµή NULL. Η αναδροµική διάσχιση είναι γενικά ακριβή σε µνήµη. Οι δείκτες NULL µπορούν να δείχνουν σε άλλους κόµβους νηµατικά δένδρα ο δείκτης right κόµβου χωρίς δεξιό παιδί δείχνει στον επόµενό του κόµβο στην ενδοδιατεταγµένη διάταξη, ο δείκτης left κόµβου χωρίς αριστερό παιδί δείχνει στον προηγούµενο κόµβο στην ενδοδιατεταγµένη διάταξη. Χρειαζόµαστε ένα ακόµη bit ανά δείκτη για να ξεχωρίζουµε νηµατικούς από κανονικούς δείκτες. 29

Νηµατικά υαδικά ένδρα function InorderSuccessor(pointer N): pointer /* επιστρέφει δείκτη στον κόµβο που έπεται του Ν στην ενδοδιατεταγµένη διάσχιση και NULL αν δεν υπάρχει */ p = N->right if (p == NULL) return NULL else if (ο N->right δεν είναι νηµατικός δείκτης) while (ο p->left δεν είναι νηµατικός) do /* Σηµ.: ο p->left δεν είναι NULL */ p = p->left return p 30

Εισαγωγή Κόµβου σε Νηµατικό υαδικό ένδρο προς x p p προς y προς x q p p προς y q procedure ThreadedInsert(pointer r, key k): /* εισαγωγή τιµής k σε νηµατικό δένδρο µε ρίζα r */ εισαγωγή k σε δυαδικό δένδρο αναζήτησης έστω q ο νέος κόµβος και p ο γονέας του q->key = k; /* ανάθεση τιµής κλειδιού */ if (k < p->key) then /* εισαγωγή ως αριστερό παιδί */ q->left = p->left; q->right = p; p->left = q; else /* εισαγωγή ως δεξιό παιδί */ q->left = p; q->right = p->right; p->right = q; q->ltype = p->ltype; q->rtype = thread; q->ltype = thread; q->rtype = p->rtype; 31