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

Σχετικά έγγραφα
Δομές Δεδομένων και Αλγόριθμοι

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

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

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

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

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

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

Εργαστήριο 4: Υλοποίηση Αφηρημένου Τύπου Δεδομένων: Ταξινομημένη Λίστα

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

Φροντιςτήριο. Linked-List

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

Γραμμικές λίστες. Γκόγκος Χρήστος ΤΕΙ Ηπείρου

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

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

ΑΣΚΗΣΕΙΣ ΓΙΑ ΤΟ ΕΡΓΑΣΤΗΡΙΟ 2

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

Διάλεξη 12: Λίστες Υλοποίηση & Εφαρμογές. Διδάσκων: Παναγιώτης Ανδρέου

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

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

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

#4. Heaps (σωροί), η ταξινόμηση HeapSort, η δομή std::priority_queue της STL

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

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

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

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

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

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

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

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

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

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

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

Προγραμματισμός Υπολογιστών με C++

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

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

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

Διάλεξη 07: Λίστες Ι Υλοποίηση & Εφαρμογές

Εργαστήριο 2: Πίνακες

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

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

Μάθημα 21: Ουρές (Queues)

AVL-trees C++ implementation

ΕΡΓΑΣΤΗΡΙΟ 5 ΣΗΜΕΙΩΣΕΙΣ

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

Προγραμματισμός Υπολογιστών με C++

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

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

Standard Template Library (STL)

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

Εργαστήριο 8: Αναδρομική διεργασία εισαγωγής καινούριου κόμβου σε ΔΔΑ

ΑΣΚΗΣΕΙΣ ΓΙΑ ΤΟ ΕΡΓΑΣΤΗΡΙΟ 3

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

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

Διάλεξη 14: Δομές Δεδομένων ΙΙI (Λίστες και Παραδείγματα)

ΛΥΣΕΙΣ ΘΕΜΑΤΩΝ ΤΕΛΙΚΗΣ ΦΑΣΗΣ

Α Β Γ static; printf("%c\n", putchar( A +1)+2); B DB BD. int i = 0; while (++i); printf("*");

Ονοματεπώνυμο και ΑΜ: Είχα παραδώσει εργασίες τα προηγούμενα ακαδημαϊκά έτη: ΚΑΛΗ ΕΠΙΤΥΧΙΑ!

Σημειώσεις όγδοης εβδομάδας

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

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

Σύνοψη Προηγούμενου. Λίστες (Lists) Συνδεδεμένες Λίστες: Εισαγωγή (1/2) Συνδεδεμένες Λίστες. Ορέστης Τελέλης

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

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

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

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

Alternative to Balanced Trees, Comms of the ACM, 33(6), June 1990,

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

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

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

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

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

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

υναµικές οµές εδοµένων (συν.) Στην ενότητα αυτή θα µελετηθούν τα εξής επιµέρους θέµατα:

ΕΠΛ232 Προγραμματιστικές Τεχνικές και Εργαλεία Δυναμική Δέσμευση Μνήμης και Δομές Δεδομένων (Φροντιστήριο)

Προγραμματισμός Ι. Κλάσεις και Αντικείμενα. Δημήτρης Μιχαήλ. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

HY150a Φροντιστήριο 3 24/11/2017

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

Εργαστήριο 5: Υλοποίηση Αφηρημένου Τύπου Δεδομένων: Διπλά Συνδεδεμένη Λίστα

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

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

Φροντιστήριο 4 Σκελετοί Λύσεων

Δομές Δεδομένων. Ενότητα 6: Εφαρμογή Συνδεδεμένων Λιστών: Αλφαβητικό ευρετήριο κειμένου- Υλοποίηση ΑΤΔ Στοίβα και Ουρά με δείκτες

19. ΠΡΟΤΥΠΑ (TEMPLATES)

Τίτλος Μαθήματος: Ηλεκτρονικοί Υπολογιστές IΙΙ. Διδάσκων: Επίκουρος Καθηγητής Αθανάσιος Σταυρακούδης

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

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

4. Συνδεδεμένες Λίστες

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

ΑΣΚΗΣΕΙΣ ΓΙΑ ΤΟ ΕΡΓΑΣΤΗΡΙΟ 1

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

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

Ερώτημα Α 1. Να γράψετε τις εντολές που πραγματοποιούν τα ακόλουθα:

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

Διάλεξη 22η: Επιπλέον στοιχεία της C

Δομημένος Προγραμματισμός (ΤΛ1006)

Αλγόριθμοι Ταξινόμησης Μέρος 3

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

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

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

Περιεχόμενα. Πρόλογος... 17

Transcript:

Δομές Δεδομένων και Αλγόριθμοι (Γ εξάμηνο) Τμήμα Μηχανικών Πληροφορικής ΤΕ, ΤΕΙ Ηπείρου Γκόγκος Χρήστος 04/12/2014 Άσκηση εργαστηρίου #6 (Υλοποίηση δυαδικού δένδρου αναζήτησης) Στην εργασία αυτή παρουσιάζεται η υλοποίηση ενός δυαδικού δένδρου αναζήτησης. Θα χρησιμοποιηθεί η δομή struct node. // οµή κόµβου δένδρου struct node { int key; struct node* left; struct node* right; ; Η δημιουργία ενός νέου κόμβου γίνεται με τη συνάρτηση new_node και η προσθήκη του κόμβου στο δένδρο γίνεται με τη συνάρτηση insert_node που καλεί τη συνάρτηση new_node. Ο δε εντοπισμός ενός κόμβου στο δένδρο γίνεται με τη συνάρτηση find. // ηµιουργία ενός νέου κόµβου struct node* new_node(int key) { struct node* node = new (struct node); node->key = key; node->left = NULL; node->right = NULL; // Προσθήκη του κόµβου στο δένδρο struct node* insert_node(struct node* node, int key) { return (new_node(key)); { if (key == node->key) { cerr << "only distinct values are accepted!" << endl; return node; if (key < node->key) node->left = insert_node(node->left, key); node->right = insert_node(node->right, key); // Εύρεση ενός κόµβου στο δένδρο struct node* find(struct node* node, int key) { return (NULL); { if (key == node->key) if (key < node->key) return (find(node->left, key)); 1

return (find(node->right, key)); Για τη δημιουργία του ακόλουθου δένδρου και εν συνεχεία για τον εντοπισμό της τιμής 9 μπορεί να χρησιμοποιηθεί ο κώδικας που ακολουθεί. #include <iostream> #include <list> using namespace std; //... int main(int argc, char **argv) { list<int> data = { 20, 13, 7, 14, 9, 8, 10, 25, 22, 35 ; struct node* root = NULL; for (int x : data) { root = insert_node(root, x); struct node* a_node = find(root, 9); if (a_node == NULL) cout << " ε βρέθηκε " << endl; cout << "Βρέθηκε " << a_node->key << endl; //... Ερώτημα 1 Να προστεθούν οι ακόλουθες συναρτήσεις οι οποίες πραγματοποιούν διάσχιση του δένδρου preorder (προδιατεταγμένα), postorder (μεταδιατεταγμένα) και levelorder (διατεταγμένα κατά επίπεδα). Στη δεύτερη στήλη παρουσιάζεται η σειρά με την οποία θα εμφανιστούν τα δεδομένα για καθένα από τους τρόπους διάχισης του δένδρου. 2

void preorder_traversal(struct node* node) { if (node == NULL) return; printf("%d ", node->key); 20 13 7 9 8 10 14 25 22 35 preorder_traversal(node->left); preorder_traversal(node->right); void postorder_traversal(struct node* node) { if (node == NULL) return; postorder_traversal(node->left); 8 10 9 7 14 13 22 35 25 20 postorder_traversal(node->right); printf("%d ", node->key); void levelorder_traversal(struct node* node) { queue<struct node*> q; q.push(node); while (!q.empty()) { struct node* tmp = q.front(); printf("%d ", tmp->key); if (tmp->left!= NULL) 20 13 25 7 14 22 35 9 8 10 q.push(tmp->left); if (tmp->right!= NULL) q.push(tmp->right); q.pop(); Παρατήρηση: Για τη συνάρτηση levelorder_traversal θα χρειαστεί να δηλωθεί η βιβλιοθήκη queue. Να υλοποιηθεί η συνάρτηση της ενδοδιατεταγμένης (inorder) διάσχισης του δένδρου. Τι παρατηρείτε για τον τρόπο με τον οποίο εμφανίζονται τα δεδομένα του δένδρου. void inorder_traversal(struct node* node) { 7 8 9 10 13 14 20 22 25 35 Ερώτημα 2 Να προστεθούν οι ακόλουθες συναρτήσεις οι οποίες υπολογίζουν το ύψος του δένδρου και τη μικρότερη τιμή που είναι αποθηκευμένη στο δένδρο. int height(struct node* node) { return (-1); { int l_height = height(node->left); int r_height = height(node->right); if (l_height > r_height) return (l_height + 1); return (r_height + 1); int min_value(struct node* node) { struct node* current = node; while (current->left!= NULL) { current = current->left; return (current->key); 3

Να υλοποηθεί η συνάρτηση υπολογισμού του πλήθους των κόμβων του δένδρου και η συνάρτηση υπολογισμού της μεγαλύτερης τιμής max_value που είναι αποθηκευμένη στο δένδρο. int size(struct node* node) { int max_value(struct node* node) { Ερώτημα 3 Να προστεθεί η ακόλουθη συνάρτηση η οποία επιτρέπει τη διαγραφή ενός στοιχείου από το δυαδικό δένδρο αναζήτησης. void delete_node(struct node* tree, int key) { struct node* ptr = tree; struct node* parent = NULL; bool turn_left = false; while (ptr!= NULL && ptr->key!= key) { parent = ptr; if (key < ptr->key) { turn_left = true; ptr = ptr->left; { turn_left = false; ptr = ptr->right; if (ptr == NULL) { cout << "Value " << key << " not found" << endl; if (ptr->left == NULL && ptr->right == NULL) { // case 1: leaf parent->left = NULL; parent->right = NULL; if (ptr->left == NULL) { // case 2: single subtree parent->left = ptr->right; parent->right = ptr->right; if (ptr->right == NULL) { parent->left = ptr->left; parent->right = ptr->left; { // case 3: two subtrees // replace node to be deleted with the largest value of its left subtree int max_value_left_subtree = max_value(ptr->left); struct node* tmp = ptr->left; 4

while (tmp->right->key!= max_value_left_subtree) { tmp = tmp->right; ptr->key = max_value_left_subtree; delete tmp->right; tmp->right = NULL; Να κληθεί η συνάρτηση delete_node από το κύριο πρόγραμμα και να συμπληρωθεί στον ακόλουθο πίνακα το τι θα εμφανίζεται στη διάσχιση του δένδρου κατά επίπεδα αν συμβεί η κάθε μία από τις ακόλουθες διαγραφές ξεχωριστά. Διαγραφή του κλειδιού 22 7 8 9 10 13 14 20 25 35 Διαγραφή του κλειδιού 7 20 13 25 9 14 22 35 8 10 Διαγραφή του κλειδιού 13 20 10 25 7 14 22 35 9 8 Αναφορές http://cslibrary.stanford.edu/110/binarytrees.html#s1 5