ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΕΣ ΤΕΧΝΙΚΕΣ Διδάσκοντες:Γιάννης Μαΐστρος Στάθης Ζάχος Νίκος Παπασπύρου 1Νίκος ΠαπασπύρουΠρογραμματιστικές Τεχνικές Διαφάνειες παρουσίασης #8 (β) 4 Δένδρα γενικής μορφής 4 Διάσχιση δυαδικών δένδρων 4 Αριθμητικές εκφράσεις 4 Δυαδικά δένδρα αναζήτησης
2Νίκος ΠαπασπύρουΠρογραμματιστικές Τεχνικές Δένδρα γενικής μορφής u Κάθε κόμβος k έχει n k απογόνους, όπου n k Ν u Κωδικοποίηση με δυαδικά δένδρα
3Νίκος ΠαπασπύρουΠρογραμματιστικές Τεχνικές u Σειρά με την οποία διασχίζονται οι κόμβοι l κατά βάθος (depth first) l κατά πλάτος (breadth first) Διάσχιση δυαδικών δένδρων(i) u Κατά βάθος 42, 10, 7, 14, 12, 30, 50, 55, 52 u Κατά πλάτος 42, 10, 50, 7, 14, 55, 12, 30, 52
4Νίκος ΠαπασπύρουΠρογραμματιστικές Τεχνικές Διάσχιση δυαδικών δένδρων(ii) u Εκτύπωση κατά βάθος l πολύ απλά, με χρήση αναδρομής u Υλοποίηση void treePrintDF (tree t) { if (t != NULL) { printf("%d ", t->data); treePrintDF(t->left); treePrintDF(t->right); } }
5Νίκος ΠαπασπύρουΠρογραμματιστικές Τεχνικές Διάσχιση δυαδικών δένδρων(iii) u Εκτύπωση κατά πλάτος l με τη βοήθεια ουράς για την αποθήκευση δεικτών προς τους κόμβους που δεν έχουμε επισκεφθεί u Υλοποίηση void treePrintBF (tree t) { queue q = queueEmpty; if (t != NULL) queueInsert(&q, t);
6Νίκος ΠαπασπύρουΠρογραμματιστικές Τεχνικές Διάσχιση δυαδικών δένδρων(iv) u Εκτύπωση κατά πλάτος, υλοποίηση (συνέχεια) while (!queueIsEmpty(q)) { TreeNode * n = queueRemove(&q); printf("%d ", n->data); if (n->left != NULL) queueInsert(&q, n->left); if (n->right != NULL) queueInsert(&q, n->right); } }
7Νίκος ΠαπασπύρουΠρογραμματιστικές Τεχνικές Αριθμητικές εκφράσεις(i) u Παράδειγμα 3 * (24 / 2) + (9 - 3) u Παράσταση σε μορφή δυαδικού δένδρου l οι αριθμοί στα φύλλα l οι τελεστές στους υπόλοιπους κόμβους + *– / 9 u Διάσχιση κατά βάθος
8Νίκος ΠαπασπύρουΠρογραμματιστικές Τεχνικές Αριθμητικές εκφράσεις(ii) u Ενθεματική παράσταση l infix notation l ο τελεστής ανάμεσα στα τελούμενα l διφορούμενη: χρειάζονται παρενθέσεις l η συνήθης μορφή για τον άνθρωπο u Αποτέλεσμα (3 * (24 / 2)) + (9 - 3) + *– / 9
9Νίκος ΠαπασπύρουΠρογραμματιστικές Τεχνικές Αριθμητικές εκφράσεις(iii) u Προθεματική παράσταση l prefix notation l ο τελεστής πριν τα τελούμενα l όχι διφορούμενη, δε χρειάζονται παρενθέσεις l απλή μηχανική ανάγνωση u Αποτέλεσμα + * 3 / *– / 9
10Νίκος ΠαπασπύρουΠρογραμματιστικές Τεχνικές Αριθμητικές εκφράσεις(iv) u Επιθεματική παράσταση l postfix notation l ο τελεστής μετά τα τελούμενα l όχι διφορούμενη, δε χρειάζονται παρενθέσεις l απλή μηχανική αποτίμηση u Αποτέλεσμα / * *– / 9
11Νίκος ΠαπασπύρουΠρογραμματιστικές Τεχνικές Δυαδικά δένδρα αναζήτησης(i) u Binary search trees u Δυαδικά δένδρα με τις παρακάτω ιδιότητες για κάθε κόμβο: l όλοι οι κόμβοι του αριστερού παιδιού έχουν τιμές μικρότερες ή ίσες της τιμής του κόμβου l όλοι οι κόμβοι του δεξιού παιδιού έχουν τιμές μεγαλύτερες ή ίσες της τιμής του κόμβου
12Νίκος ΠαπασπύρουΠρογραμματιστικές Τεχνικές Δυαδικά δένδρα αναζήτησης(ii) u Τα δυαδικά δένδρα αναζήτησης διευκολύνουν την αναζήτηση στοιχείων u Αναδρομική αναζήτηση l αν η τιμή που ζητείται είναι στη ρίζα, βρέθηκε l αν είναι μικρότερη από την τιμή της ρίζας, αρκεί να αναζητηθεί στο αριστερό παιδί l αν είναι μεγαλύτερη από την τιμή της ρίζας, αρκεί να αναζητηθεί στο δεξί παιδί u Κόστος αναζήτησης: O(log n) l υπό την προϋπόθεση το δένδρο να είναι ισοζυγισμένο
13Νίκος ΠαπασπύρουΠρογραμματιστικές Τεχνικές Δυαδικά δένδρα αναζήτησης(iii) u Αναζήτηση TreeNode * treeSearch (tree t, int key) { if (t == NULL) return NULL; /* not found */ if (t->data == key) return t; /* found */ if (t->data > key) return treeSearch(t->left, key); else return treeSearch(t->right, key); }