Η παρουσίαση φορτώνεται. Παρακαλείστε να περιμένετε

Η παρουσίαση φορτώνεται. Παρακαλείστε να περιμένετε

9-1 ΜΑΘΗΜΑ 9 ο Δυαδικά Δένδρα, Διάσχιση Δυαδικών Δένδρων Υλικό από τις σημειώσεις Ν. Παπασπύρου, 2006.

Παρόμοιες παρουσιάσεις


Παρουσίαση με θέμα: "9-1 ΜΑΘΗΜΑ 9 ο Δυαδικά Δένδρα, Διάσχιση Δυαδικών Δένδρων Υλικό από τις σημειώσεις Ν. Παπασπύρου, 2006."— Μεταγράφημα παρουσίασης:

1 9-1 ΜΑΘΗΜΑ 9 ο Δυαδικά Δένδρα, Διάσχιση Δυαδικών Δένδρων Υλικό από τις σημειώσεις Ν. Παπασπύρου, 2006

2 9-2 Δυαδικά δένδρα(i) Binary trees Δυο σύνδεσμοι σε κάθε κόμβο –αριστερό και δεξί παιδί Κάθε κόμβος έχει 0, 1 ή 2 παιδιά Ρίζα: ο αρχικός κόμβος του δένδρου Φύλλα: κόμβοι χωρίς παιδιά Βάθος κόμβου: αριθμός συνδέσμων από τη ρίζα

3 9-3 Δυαδικά δένδρα(ii) Τύπος κόμβου TreeNode typedef struct TreeNode_tag { int data; struct TreeNode_tag * left; struct TreeNode_tag * right; } TreeNode; Τύπος tree typedef TreeNode * tree; Κενό δένδρο const tree treeEmpty = NULL;

4 9-4 Δυαδικά δένδρα(iii) Εισαγωγή σε δένδρα –Καθοριστική απόφαση: σε ποιο σημείο του δένδρου θα εισαχθεί ο νέος κόμβος –Ισοζυγισμένα δένδρα (balanced trees): το βάθος δυο φύλλων διαφέρει το πολύ κατά 1 Συνάρτηση μέγιστου βάθους int treeDepth (tree t) { if (t == NULL) return 0; return 1 + max(treeDepth(t->left), treeDepth(t->right)); }

5 9-5 Δυαδικά δένδρα(iv) Εισαγωγή σε ισοζυγισμένα δένδρα void treeBalancedInsert (tree * t, int d) { if (*t == NULL) { *t = (TreeNode *) malloc(sizeof(TreeNode)); if (*t == NULL) { printf("Out of memory\n"); exit(1); } (*t)->data = d; (*t)->left = (*t)->right = NULL; }

6 9-6 Δυαδικά δένδρα(v) Εισαγωγή σε ισοζυγισμένα δένδρα (συνέχεια) else { int d1 = treeDepth((*t)->left); int d2 = treeDepth((*t)->right); if (d1 <= d2) treeBalancedInsert( &((*t)->left), d); else treeBalancedInsert( &((*t)->right), d); }

7 9-7 Δένδρα γενικής μορφής Κάθε κόμβος k έχει n k απογόνους, όπου n k  Ν 1 234 65 7 Κωδικοποίηση με δυαδικά δένδρα 1 2 3 4 5 7 6

8 9-8 Σειρά με την οποία διασχίζονται οι κόμβοι –κατά βάθος (depth first) –κατά πλάτος (breadth first) Διάσχιση δυαδικών δένδρων(i) 42 1050 755 523012 14 Κατά βάθος 42, 10, 7, 14, 12, 30, 50, 55, 52 Κατά πλάτος 42, 10, 50, 7, 14, 55, 12, 30, 52

9 9-9 Διάσχιση δυαδικών δένδρων(ii) Εκτύπωση κατά βάθος –πολύ απλά, με χρήση αναδρομής Υλοποίηση void treePrintDF (tree t) { if (t != NULL) { printf("%d ", t->data); treePrintDF(t->left); treePrintDF(t->right); } }

10 9-10 Διάσχιση δυαδικών δένδρων(iii) Εκτύπωση κατά πλάτος –με τη βοήθεια ουράς για την αποθήκευση δεικτών προς τους κόμβους που δεν έχουμε επισκεφθεί Υλοποίηση void treePrintBF (tree t) { queue q = queueEmpty; if (t != NULL) queueInsert(&q, t);

11 9-11 Διάσχιση δυαδικών δένδρων(iv) Εκτύπωση κατά πλάτος, υλοποίηση (συνέχεια) 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); }

12 9-12 Αριθμητικές εκφράσεις(i) Παράδειγμα 3 * (24 / 2) + (9 - 3) Παράσταση σε μορφή δυαδικού δένδρου –οι αριθμοί στα φύλλα –οι τελεστές στους υπόλοιπους κόμβους + *– 33 224 / 9 Διάσχιση κατά βάθος

13 9-13 Αριθμητικές εκφράσεις(ii) Ενθεματική παράσταση –infix notation –ο τελεστής ανάμεσα στα τελούμενα –διφορούμενη: χρειάζονται παρενθέσεις –η συνήθης μορφή για τον άνθρωπο Αποτέλεσμα (3 * (24 / 2)) + (9 - 3) + *– 33 224 / 9

14 9-14 Αριθμητικές εκφράσεις(iii) Προθεματική παράσταση –prefix notation –ο τελεστής πριν τα τελούμενα –όχι διφορούμενη, δε χρειάζονται παρενθέσεις –απλή μηχανική ανάγνωση Αποτέλεσμα + * 3 / 24 2 - 9 3 + *– 33 224 / 9

15 9-15 Αριθμητικές εκφράσεις(iv) Επιθεματική παράσταση –postfix notation –ο τελεστής μετά τα τελούμενα –όχι διφορούμενη, δε χρειάζονται παρενθέσεις –απλή μηχανική αποτίμηση Αποτέλεσμα 3 24 2 / * 9 3 - + + *– 33 224 / 9

16 9-16 Υλοποίηση αριθμητικών εκφράσεων Έκφραση: δυαδικό δένδρο ειδικής μορφής Κόμβοι δύο ειδών: –αριθμητικές σταθερές (φύλλα) –τελεστές (με δύο τελούμενα) Πληροφορία: –τιμή σταθεράς, ή –σύμβολο τελεστή Σύνδεσμοι: –τελούμενα

17 9-17 Κόμβος δένδρου typedef struct ExprNode_tag { enum { EXP_const, EXP_binop } code; union { double constant; struct { char op; struct ExprNode_tag *arg1, *arg2; } binop; } data; } ExprNode, *expr; code data constant ή binop op arg1 arg2

18 9-18 Κατασκευή σταθερών expr exprConst (double constant) { ExprNode * e = (ExprNode *) malloc(sizeof(ExprNode)); if (e == NULL) { printf("Out of memory\n"); exit(1); } e->code = EXP_const; e->data.constant = constant; return e; } code data constant ή binop op arg1 arg2

19 9-19 Κατασκευή εκφράσεων με τελεστή expr exprBinop (expr arg1, char op, expr arg2) { ExprNode * e = (ExprNode *) malloc(sizeof(ExprNode)); if (e == NULL) { printf("Out of memory\n"); exit(1); } e->code = EXP_binop; e->data.binop.op = op; e->data.binop.arg1 = arg1; e->data.binop.arg2 = arg2; return e; } code data constant ή binop op arg1 arg2

20 9-20 Παράδειγμα κατασκευής Έκφραση: 3 * (24 / 2) + (9 - 3) + *– 33 224 / 9 expr e = exprBinop( exprConst(3),'*', exprBinop( exprConst(24), '/', exprConst(2) ) ), '+', exprBinop( exprConst(9), '-', exprConst(3) ) );

21 9-21 Καταστροφή έκφρασης void exprFree (expr e) { switch (e->code) { case EXP_binop: exprFree(e->data.binop.arg1); exprFree(e->data.binop.arg2); break; } free(e); } code data constant ή binop op arg1 arg2

22 9-22 Εκτύπωση έκφρασης void exprPrint (expr e) { switch (e->code) { case EXP_const: printf("%lg", e->data.constant); break; case EXP_binop: printf("("); exprPrint(e->data.binop.arg1); printf("%c", e->data.binop.op); exprPrint(e->data.binop.arg2); printf(")"); break; } code data constant ή binop op arg1 arg2

23 9-23 Υπολογισμός έκφρασης double exprCalc (expr e) { switch (e->code) { case EXP_const: return e->data.constant; case EXP_binop: switch (e->data.binop.op) { case '+': return exprCalc(e->data. binop.arg1) + exprCalc(e->data. binop.arg2); case '-':...


Κατέβασμα ppt "9-1 ΜΑΘΗΜΑ 9 ο Δυαδικά Δένδρα, Διάσχιση Δυαδικών Δένδρων Υλικό από τις σημειώσεις Ν. Παπασπύρου, 2006."

Παρόμοιες παρουσιάσεις


Διαφημίσεις Google