Diese Präsentation wurde erfolgreich gemeldet.
Wir verwenden Ihre LinkedIn Profilangaben und Informationen zu Ihren Aktivitäten, um Anzeigen zu personalisieren und Ihnen relevantere Inhalte anzuzeigen. Sie können Ihre Anzeigeneinstellungen jederzeit ändern.

ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ ΣΕ C - ΜΑΘΗΜΑ 6

2.776 Aufrufe

Veröffentlicht am

.

Veröffentlicht in: Bildung
  • Als Erste(r) kommentieren

ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ ΣΕ C - ΜΑΘΗΜΑ 6

  1. 1. ∆οµές ∆εδοµένων σε C Μάθηµα 6: ∆υαδικά ∆ένδρα ∆ηµήτρης Ψούνης
  2. 2. Περιεχόµενα Μαθήµατος Α. Θεωρία 1. ∆ένδρο 1. Ορισµός ∆ένδρου 2. Οικογενειακές Σχέσεις 3. Ύψος – Επίπεδα ∆ένδρου 2. ∆υαδικό ∆ένδρο 1. Ορισµός ∆υαδικού ∆ένδρου 2. Ιδιότητες ∆υαδικών ∆ένδρων 3. Βασικές Πράξεις 4. Συνεχόµενη Αναπαράσταση 5. ∆υαδική Αναπαράσταση 2∆ηµήτρης Ψούνης, ∆οµές ∆εδοµένων σε C, Μάθηµα 6: ∆υαδικά ∆ένδρα 3. ∆υαδικά ∆ένδρα µε ∆υναµική Αναπαράσταση 1. Υλοποίηση σε C: ∆ηλώσεις 2. Υλοποίηση σε C: Αρχικοποίηση ∆ένδρου 3. Υλοποίηση σε C: Έλεγχοι – Άδειο ∆ένδρο 4. Υλοποίηση σε C: Περιεχόµενο Κόµβου 5. Υλοποίηση σε C: Εισαγωγή ως Ρίζα 6. Υλοποίηση σε C: Εισαγωγή Αριστερού Παιδιού 7. Υλοποίηση σε C: Εισαγωγή ∆εξιού Παιδιού 8. Υλοποίηση σε C: ∆ιαγραφή Ρίζας 9. Υλοποίηση σε C: ∆ιαγραφή Αριστερού Παιδιού 10. Υλοποίηση σε C: ∆ιαγραφή ∆εξιού Παιδιού 4. ∆ιαπέραση ∆υαδικών ∆ένδρων 1. Υλοποίηση σε C: Προδιατεταγµένη ∆ιαπέραση 2. Υλοποίηση σε C: Ενδοδιατεταγµένη ∆ιαπέραση 3. Υλοποίηση σε C: Μεταδιατεταγµένη ∆ιαπέραση Β. Ασκήσεις
  3. 3. A. Θεωρία 1. ∆ένδρο 1. Ορισµός ∆ένδρου 3∆ηµήτρης Ψούνης, ∆οµές ∆εδοµένων σε C, Μάθηµα 6: ∆υαδικά ∆ένδρα Το «∆ένδρο» είναι µια µη γραµµική, ιεραρχική δοµή δεδοµένων στην οποία: • Αποτελείται από κόµβους (κορυφές) και ακµές (πλευρές) που οµοιάζουν µε ένα (ανάποδο) δένδρο. Οι κόµβοι είναι τριών ειδών: • Η ρίζα είναι ο µοναδικός κόµβος από τον οποίο µόνο ξεκινούν ακµές • Οι εσωτερικοί κόµβοι (ή µη τερµατικοί) στις οποίες καταλήγουν και ξεκινούν ακµές. • Τα φύλλα (ή τερµατικοί κόµβοι) στα οποία καταλήγει µόνο µία ακµή. Παράδειγµα: • Ρίζα: Α • Εσωτερικοί Κόµβοι: Β,Γ,Ε • Φύλλα: ∆,Η,Ζ Παρατηρήσεις: • Το δένδρο χωρίς κόµβους λέγεται «κενό δένδρο» (null tree). • Ένας εσωτερικός κόµβος έχει τουλάχιστον ένα παιδί . • Τα φύλλα δεν έχουν παιδιά.
  4. 4. A. Θεωρία 1. ∆ένδρο 2. Οικογενειακές Σχέσεις στα ∆ένδρα 4∆ηµήτρης Ψούνης, ∆οµές ∆εδοµένων σε C, Μάθηµα 6: ∆υαδικά ∆ένδρα Σε ένα δένδρο ορίζονται «οικογενειακές σχέσεις» των κόµβων. Στο παράδειγµα µελετάµε την οικογένεια του κόµβου Β: Α ΓΒ ΖΕ∆ Η Υποδένδρο µε ρίζα το Β ∆: Αριστερό Παιδί του Β Ε: ∆εξί Παιδί του Β Α: Πατέρας της Β (Πρόγονος του Β) ∆,Ε,Η: Απόγονοι του Β Γ: Αδελφός του Β
  5. 5. A. Θεωρία 1. ∆ένδρο 3. Ύψος – Επίπεδα ∆ένδρου 5∆ηµήτρης Ψούνης, ∆οµές ∆εδοµένων σε C, Μάθηµα 6: ∆υαδικά ∆ένδρα • ∆ιαδροµή: Ακολουθία κόµβων από µια αφετηρία προς κάποιο απόγονο • Μήκος ∆ιαδροµής: Πλήθος ακµών της διαδροµής • Επίπεδο Κόµβου: Μήκος ∆ιαδροµής από τη ρίζα • Ύψος ∆ένδρου: Μέγιστο επίπεδο Κόµβου • Βαθµός Κόµβου: Πλήθος Παιδιών Κόµβου Ύψος ∆ένδρου = 3 Α ΓΒ ΖΕ∆ Η Επίπεδο 0 Επίπεδο 1 Επίπεδο 2 Επίπεδο 3 Παράδειγµα ∆ιαδροµής: Α,Β,Ε,Η Μήκος ∆ιαδροµής: 3
  6. 6. A. Θεωρία 2. ∆υαδικό ∆ένδρο 1. Ορισµός ∆υαδικού ∆ένδρου 6∆ηµήτρης Ψούνης, ∆οµές ∆εδοµένων σε C, Μάθηµα 6: ∆υαδικά ∆ένδρα Επιπλέον ορισµοί : • ∆υαδικό ∆ένδρο: ∆ένδρο που κάθε κορυφή έχει το πολύ δύο παιδιά. • Πλήρες ∆υαδικό ∆ένδρο: ∆υαδικό ∆ένδρο στο οποίο: • Όλα τα επίπεδα εκτός ίσως από το τελευταίο έχουν όλους τους δυνατούς κόµβους. • Στο τελευταίο επίπεδο οι κόµβοι είναι «όσο το δυνατόν αριστερά» ∆υαδικό ∆ένδρο Όχι Πλήρες ∆υαδικό ∆ένδρο Όχι Πλήρες Πλήρες ∆υαδικό ∆ένδρο
  7. 7. Απόδειξη: Καταµετράµε τις κορυφές σε ένα δυαδικό δένδρο: • Στο επίπεδο 0 έχουµε το πολύ 2 κορυφές • Στο επίπεδο 1 έχουµε το πολύ 2 κορυφές • … • Στο επίπεδο H έχουµε το πολύ 2 κορυφές (φύλλα) Συνεπώς συνολικά οι κορυφές είναι το πολύ: 2 2 ⋯ 2 2 1 2 1 2 1 A. Θεωρία 2. ∆υαδικό ∆ένδρο 2. Ιδιότητες των ∆υαδικών ∆ένδρων 7∆ηµήτρης Ψούνης, ∆οµές ∆εδοµένων σε C, Μάθηµα 6: ∆υαδικά ∆ένδρα Ιδιότητα 1: • Ένα δυαδικό δένδρο ύψους H έχει το πολύ n=2H+1-1 κόµβους Ιδιότητα 2: • Σε ένα πλήρες δυαδικό δένδρο n κόµβων, ισχύει για το ύψος H ότι log(n+1)-1 ≤ H ≤ logn Απόδειξη: Οµοίως µε την προηγούµενη απόδειξη, µόνο που στο τελευταίο επίπεδο έχουµε: • Το πολύ 2H κόµβους άρα συνολικά n 2 1 ⇒ n 1 2 ⇒ log n 1 log 2 ⇒ log n 1 1 ⇒ log n 1 1 • Τουλάχιστον ένα κόµβο: n 2 1 1 ⇒ n 2 ⇒ log n log 2 ⇒ log n Η ⇒ Η log n
  8. 8. A. Θεωρία 2. ∆υαδικό ∆ένδρο 3. Βασικές Πράξεις 8∆ηµήτρης Ψούνης, ∆οµές ∆εδοµένων σε C, Μάθηµα 6: ∆υαδικά ∆ένδρα Οι βασικές πράξεις σε ένα δένδρο είναι: • Αρχικοποίηση του δένδρου (init) • Εισαγωγή ενός στοιχείου στο δένδρο (insert) • ∆ιαγραφή ενός στοιχείου από το δένδρο (delete) • Έλεγχος αν το δένδρο είναι άδειο (empty) • Περιεχόµενο ενός κόµβου του δένδρου (data) • ∆ιαπέραση του δένδρου (traverse) Υπάρχουν δύο υλοποιήσεις: • Με δείκτες • Την ονοµάζουµε «δυναµική αναπαράσταση» • Με πίνακα • Την ονοµάζουµε «συνεχόµενη αναπαράσταση» Σηµαντική Παρατήρηση: Υπάρχουν αρκετές δευτερεύουσες πράξεις ή ακόµη και πράξεις που διαµορφώνουµε κατά περίπτωση, µιας και το δένδρο είναι µια πολύπλοκή και εξαιρετικά χρήσιµη δοµή δεδοµένων. Οι δευτερεύουσες πράξεις καθορίζονται συνήθως από ειδικές περιπτώσεις δένδρων (τα οποία θα δούµε σε επόµενα µαθήµατα) όπως τα ∆υαδικά ∆ένδρα Αναζήτησης, τα ∆ένδρα-Σωροί, τα AVL δένδρα, ή τα Β+-δένδρα.
  9. 9. A. Θεωρία 2. ∆υαδικό ∆ένδρο 4. Συνεχόµενη Αναπαράσταση 9∆ηµήτρης Ψούνης, ∆οµές ∆εδοµένων σε C, Μάθηµα 6: ∆υαδικά ∆ένδρα Στην Συνεχόµενη Αναπαράσταση ∆υαδικού ∆ένδρου θα χρησιµοποιήσουµε: • Έναν πίνακα από κόµβους µεγέθους 2 1 (data), έναν ακέραιο H (height) Θα ισχύσει η εξής σύµβαση: • Το αριστερό παιδί του κόµβου θα βρίσκεται στη θέση 2 ∗ 1 • Το δεξί παιδί του κόµβου θα βρίσκεται στη θέση 2 ∗ 2 • Άρα ο γονέας του κόµβου στη θέση θα βρίσκεται στη θέση 1 DIV 2 Π.χ. για το ακόλουθο δένδρο: 1. Υπολογίζουµε το ύψος 2. Νοητά Συµπληρώνουµε τους κενούς κόµβους 3. Συµπληρώνουµε τον πίνακα κατά επίπεδα (θα έχει 23+1-1=15 θέσεις) 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 Α Β Γ ∆ Ε Ζ Ηdata = 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
  10. 10. A. Θεωρία 2. ∆υαδικό ∆ένδρο 5. ∆υναµική Αναπαράσταση 10∆ηµήτρης Ψούνης, ∆οµές ∆εδοµένων σε C, Μάθηµα 6: ∆υαδικά ∆ένδρα Στην δεύτερη υλοποίηση (δυναµική αναπαράσταση) θα χρησιµοποιήσουµε: • Ο κόµβος θα αποτελείται από τα δεδοµένα (data) και δύο δείκτες: • Έναν στο αριστερό παιδί (left) • Έναν στο δεξί παιδί (right) • Ένας δείκτης θα είναι η ρίζα του δένδρου (συνηθίζεται να ονοµάζεται root) Π.χ. για το ακόλουθο δένδρο: data left A right data left B right data left Γ right data left ∆ right data left Ε right data left Ζ right Παρατήρηση: Θέτουµε τον αντίστοιχο δείκτη (left ή right) ίσο µε NULL για να δείξουµε ότι ο κόµβος δεν έχει αριστερό (ή δεξί παιδί). root
  11. 11. A. Θεωρία 3. ∆υαδικά ∆ένδρα µε ∆υναµική Αναπαράσταση 1. Υλοποίηση σε C: ∆ηλώσεις 11∆ηµήτρης Ψούνης, ∆οµές ∆εδοµένων σε C, Μάθηµα 6: ∆υαδικά ∆ένδρα Οι δηλώσεις σε C είναι οι ακόλουθες: • Ο κόµβος του δένδρου είναι µία δοµή (struct) µε τα εξής στοιχεία: • Το data µέρος του κόµβου (σε τύπο δεδοµένων που ορίζουµε). • Τους δείκτες left και right που δείχνουν το αριστερό και το δεξί παιδί του κόµβου. typedef int elem; /* typos dedomenwn dendrou*/ struct node{ /* Typos komvou dendrou */ elem data; /* dedomena */ struct node *left; /* aristero paidi */ struct node *right; /* deksi paidi */ }; typedef struct node TREE_NODE; /* Sinwnimo tou komvou dendrou */ typedef struct node *TREE_PTR; /* Sinwnimo tou deikti komvou */ Το δένδρο θα είναι ένας δείκτης σε κόµβο δένδρου (θα δηλώνεται στη main).
  12. 12. A. Θεωρία 3. ∆υαδικά ∆ένδρα µε ∆υναµική Αναπαράσταση 2. Υλοποίηση σε C: Αρχικοποίηση ∆ένδρου 12∆ηµήτρης Ψούνης, ∆οµές ∆εδοµένων σε C, Μάθηµα 6: ∆υαδικά ∆ένδρα Η αρχικοποίηση γίνεται θέτοντας τον δείκτη δένδρου ίσο µε NULL /* TR_init(): arxikopoiei to dendro */ void TR_init(TREE_PTR *root) { *root=NULL; } Προσοχή: • Πάντα προτού ξεκινάµε την χρήση του δένδρου θα πρέπει να καλούµε µία φορά αυτήν τη συνάρτηση!
  13. 13. A. Θεωρία 3. ∆υαδικά ∆ένδρα µε ∆υναµική Αναπαράσταση 3. Υλοποίηση σε C: Έλεγχος – Άδειο ∆ένδρο 13∆ηµήτρης Ψούνης, ∆οµές ∆εδοµένων σε C, Μάθηµα 6: ∆υαδικά ∆ένδρα Ο έλεγχος αν το δένδρο είναι κενό, γίνεται βλέποντας αν ο δείκτης δένδρου είναι ίσος µε NULL. /* TR_empty(): epistrefei TRUE/FALSE * analoga me to an to dendro einai adeio */ int TR_empty(TREE_PTR root) { return root == NULL; }
  14. 14. A. Θεωρία 3. ∆υαδικά ∆ένδρα µε ∆υναµική Αναπαράσταση 4. Υλοποίηση σε C: Περιεχόµενο Κόµβου 14∆ηµήτρης Ψούνης, ∆οµές ∆εδοµένων σε C, Μάθηµα 6: ∆υαδικά ∆ένδρα Η συνάρτηση επιστρέφει το περιεχόµενο (τα δεδοµένα) ενός κόµβου. /* TR_data(): epistrefei ta dedomena tou komvou pou deixnei o deiktis p */ elem TR_data(TREE_PTR p) { return p->data; }
  15. 15. A. Θεωρία 3. ∆υαδικά ∆ένδρα µε ∆υναµική Αναπαράσταση 5. Υλοποίηση σε C: Εισαγωγή ως Ρίζα 15∆ηµήτρης Ψούνης, ∆οµές ∆εδοµένων σε C, Μάθηµα 6: ∆υαδικά ∆ένδρα Η συνάρτηση «εισαγωγή ως ρίζα» εισάγει έναν νέο κόµβο ως ρίζα του δένδρου: 1. ∆ηµιουργεί τον νέο κόµβο και θέτει τα δεδοµένα σε αυτόν 2. Θέτει τον δείκτη ρίζας να δείχνει στον κόµβο αυτόν ∆ηµιουργία της ρίζας µε δεδοµένα «5» data left 5 right ΠΡΙΝ root ΜΕΤΑ root
  16. 16. A. Θεωρία 3. ∆υαδικά ∆ένδρα µε ∆υναµική Αναπαράσταση 5. Υλοποίηση σε C: Εισαγωγή ως Ρίζα 16∆ηµήτρης Ψούνης, ∆οµές ∆εδοµένων σε C, Μάθηµα 6: ∆υαδικά ∆ένδρα /* TR_insert_root(): Eisagei to stoixeio x sti riza tou dendrou */ int TR_insert_root(TREE_PTR *root,elem x) { TREE_PTR newnode; if (*root!=NULL) return FALSE; newnode=(TREE_NODE *)malloc(sizeof(TREE_NODE)); if (!newnode) { printf("Adynamia desmeusis mnimis"); return FALSE; } newnode->data=x; newnode->left=NULL; newnode->right=NULL; *root=newnode; return TRUE; }
  17. 17. A. Θεωρία 3. ∆υαδικά ∆ένδρα µε ∆υναµική Αναπαράσταση 6. Υλοποίηση σε C: Εισαγωγή ως Αριστερό Παιδί 17∆ηµήτρης Ψούνης, ∆οµές ∆εδοµένων σε C, Μάθηµα 6: ∆υαδικά ∆ένδρα Η συνάρτηση «εισαγωγή ως αριστερό παιδί» εισάγει έναν νέο κόµβο ως αριστερό παιδί: 1. ∆ηµιουργεί τον νέο κόµβο και θέτει τα δεδοµένα σε αυτόν 2. Θέτει αριστερό παιδί του τρέχοντος κόµβου ίσο µε τον νέο κόµβο 1 newnode ΕΙΣΑΓΩΓΗ του «7» ως αριστερό παιδί του κόµβου 2» data left 5 right data left 2 right data left 4 right data left 1 right node data left 7 right 2 Node->left=newnode
  18. 18. A. Θεωρία 3. ∆υαδικά ∆ένδρα µε ∆υναµική Αναπαράσταση 6. Υλοποίηση σε C: Εισαγωγή ως Αριστερό Παιδί 18∆ηµήτρης Ψούνης, ∆οµές ∆εδοµένων σε C, Μάθηµα 6: ∆υαδικά ∆ένδρα /* TR_insert_left(): Eisagei to stoixeio x ws aristero paidi tou node */ int TR_insert_left(TREE_PTR node,elem x) { TREE_PTR newnode; if (node->left!=NULL) return FALSE; newnode=(TREE_NODE *)malloc(sizeof(TREE_NODE)); if (!newnode) { printf("Adynamia desmeusis mnimis"); return FALSE; } newnode->data=x; newnode->left=NULL; newnode->right=NULL; node->left=newnode; return TRUE; }
  19. 19. A. Θεωρία 3. ∆υαδικά ∆ένδρα µε ∆υναµική Αναπαράσταση 7. Υλοποίηση σε C: Εισαγωγή ως ∆εξί Παιδί 19∆ηµήτρης Ψούνης, ∆οµές ∆εδοµένων σε C, Μάθηµα 6: ∆υαδικά ∆ένδρα Η συνάρτηση «εισαγωγή ως δεξί παιδί» εισάγει έναν νέο κόµβο ως δεξί παιδί: 1. ∆ηµιουργεί τον νέο κόµβο και θέτει τα δεδοµένα σε αυτόν 2. Θέτει δεξί παιδί του τρέχοντος κόµβου ίσο µε τον νέο κόµβο 1 newnode ΕΙΣΑΓΩΓΗ του «7» ως αριστερό παιδί του κόµβου 4» data left 5 right data left 2 right data left 4 right data left 1 right node data left 7 right 2 node->right=newnode
  20. 20. A. Θεωρία 3. ∆υαδικά ∆ένδρα µε ∆υναµική Αναπαράσταση 7. Υλοποίηση σε C: Εισαγωγή ως ∆εξί Παιδί 20∆ηµήτρης Ψούνης, ∆οµές ∆εδοµένων σε C, Μάθηµα 6: ∆υαδικά ∆ένδρα /* TR_insert_right(): Eisagei to stoixeio x ws deksi paidi tou node */ int TR_insert_right(TREE_PTR node,elem x) { TREE_PTR newnode; if (node->right!=NULL) return FALSE; newnode=(TREE_NODE *)malloc(sizeof(TREE_NODE)); if (!newnode) { printf("Adynamia desmeusis mnimis"); return FALSE; } newnode->data=x; newnode->left=NULL; newnode->right=NULL; node->right=newnode; return TRUE; }
  21. 21. A. Θεωρία 3. ∆υαδικά ∆ένδρα µε ∆υναµική Αναπαράσταση 8. Υλοποίηση σε C: ∆ιαγραφή της ρίζας 21∆ηµήτρης Ψούνης, ∆οµές ∆εδοµένων σε C, Μάθηµα 6: ∆υαδικά ∆ένδρα Η συνάρτηση δέχεται ως όρισµα τη ρίζα ενός δένδρου: 1. Ελέγχει ότι δεν έχει παιδία. 2. ∆ιαγράφει τον κόµβο. 3. Θέτει τη ρίζα ίση µε NULL ∆ΙΑΓΡΑΦΗ της ρίζας του δένδρου data left 5 right ΠΡΙΝ root ΜΕΤΑ root
  22. 22. A. Θεωρία 3. ∆υαδικά ∆ένδρα µε ∆υναµική Αναπαράσταση 8. Υλοποίηση σε C: ∆ιαγραφή της ρίζας 22∆ηµήτρης Ψούνης, ∆οµές ∆εδοµένων σε C, Μάθηµα 6: ∆υαδικά ∆ένδρα /* TR_delete_root(): Diagrafei ti riza enos dentrou efoson den exei paidia */ int TR_delete_root(TREE_PTR *root, elem *x) { if ((*root)->left!=NULL || (*root)->right!=NULL) return FALSE; *x=(*root)->data; free(*root); *root=NULL; return TRUE; }
  23. 23. A. Θεωρία 3. ∆υαδικά ∆ένδρα µε ∆υναµική Αναπαράσταση 9. Υλοποίηση σε C: ∆ιαγραφή αριστερού παιδιού κόµβου 23∆ηµήτρης Ψούνης, ∆οµές ∆εδοµένων σε C, Μάθηµα 6: ∆υαδικά ∆ένδρα Η συνάρτηση δέχεται ως όρισµα έναν κόµβο (στον οποίο δείχνει ο parent) και διαγράφει το αριστερό παιδί του: 1. Ελέγχει ότι το αριστερό παιδί δεν έχει παιδιά. 2. ∆ιαγράφει το αριστερό παιδί. 3. Θέτει τον δείκτη left του κόµβου parent ίσο µε NULL. ∆ΙΑΓΡΑΦΗ του αριστερού παιδιού του κόµβου «2» 1 delete(parent->left) data left 5 right data left 2 right data left 4 right data left 1 right parent data left 7 right 2 parent->left=NULL
  24. 24. A. Θεωρία 3. ∆υαδικά ∆ένδρα µε ∆υναµική Αναπαράσταση 9. Υλοποίηση σε C: ∆ιαγραφή αριστερού παιδιού κόµβου 24∆ηµήτρης Ψούνης, ∆οµές ∆εδοµένων σε C, Μάθηµα 6: ∆υαδικά ∆ένδρα /* TR_delete_left(): Diagrafei to aristero paidi tou komvou parent (efoson den exei paidia) */ int TR_delete_left(TREE_PTR parent, elem *x) { TREE_PTR current; if (parent->left==NULL) return FALSE; current=parent->left; if (current->left!=NULL || current->right!=NULL) return FALSE; *x=current->data; free(current); parent->left=NULL; return TRUE; }
  25. 25. A. Θεωρία 3. ∆υαδικά ∆ένδρα µε ∆υναµική Αναπαράσταση 10. Υλοποίηση σε C: ∆ιαγραφή δεξιού παιδιού κόµβου 25∆ηµήτρης Ψούνης, ∆οµές ∆εδοµένων σε C, Μάθηµα 6: ∆υαδικά ∆ένδρα Η συνάρτηση δέχεται ως όρισµα έναν κόµβο (στον οποίο δείχνει ο parent) και διαγράφει το δεξί παιδί του: 1. Ελέγχει ότι το δεξί παιδί δεν έχει παιδιά. 2. ∆ιαγράφει το δεξί παιδί. 3. Θέτει τον δείκτη right του κόµβου parent ίσο µε NULL. parent 2 parent->right=NULL 1 delete(parent->right) data left 5 right data left 2 right data left 4 right data left 1 right data left 6 right data left 7 right ∆ΙΑΓΡΑΦΗ του δεξιού παιδιού του κόµβου «4»
  26. 26. A. Θεωρία 3. ∆υαδικά ∆ένδρα µε ∆υναµική Αναπαράσταση 10. Υλοποίηση σε C: ∆ιαγραφή δεξιού παιδιού κόµβου 26∆ηµήτρης Ψούνης, ∆οµές ∆εδοµένων σε C, Μάθηµα 6: ∆υαδικά ∆ένδρα /* TR_delete_right(): Diagrafei to deksi paidi tou komvou node (efoson den exei paidia) */ int TR_delete_right(TREE_PTR parent, elem *x) { TREE_PTR current; if (parent->right==NULL) return FALSE; current=parent->right; if (current->left!=NULL || current->right!=NULL) return FALSE; *x=current->data; free(current); parent->right=NULL; return TRUE; }
  27. 27. A. Θεωρία 4. ∆ιαπέραση ∆υαδικών ∆ένδρων 1. Γενικά 27∆ηµήτρης Ψούνης, ∆οµές ∆εδοµένων σε C, Μάθηµα 6: ∆υαδικά ∆ένδρα Οι διαπεράσεις είναι µεθοδολογίες για να επισκεφθούµε όλες τις κορυφές ενός ∆υαδικού ∆ένδρου: Εξετάζουµε: Την προδιατεταγµένη διαπέραση (preorder). Που εκτελεί τη σειρά επίσκεψης: Τρέχουσα Κορυφή Αριστερό Υποδένδρο ∆εξί Υποδένδρο Την ενδοδιατεταγµένη διαπέραση (inorder). Που εκτελεί τη σειρά επίσκεψης: Αριστερό Υποδένδρο Τρέχουσα Κορυφή ∆εξί Υποδένδρο Την µεταδιατεταγµένη ∆ιαπέραση (postorder). Που εκτελεί τη σειρά επίσκεψης: Αριστερό Υποδένδρο ∆εξί Υποδένδρο Τρέχουσα Κορυφή
  28. 28. A. Θεωρία 4. ∆ιαπέραση ∆υαδικών ∆ένδρων 2. Υλοποίηση σε C: Προδιατεταγµένη ∆ιαδροµή 28∆ηµήτρης Ψούνης, ∆οµές ∆εδοµένων σε C, Μάθηµα 6: ∆υαδικά ∆ένδρα ------------------------------------------------------------- Αλγόριθµος Προδιατεταγµένης ∆ιαδροµής (PRE-ORDER) Είσοδος: ∆υαδικό ∆ένδρο Τ Έξοδος: Προδιατεταγµένη ∆ιάσχιση των Κορυφών του Τ ------------------------------------------------------------- procedure PRE-ORDER(n) Αν (n≠ΚΕΝΟ) Εκτύπωση του n PRE-ORDER(Αριστερό Παιδί της n) PRE-ORDER(∆εξί Παιδί της n) Τέλος-Αν end procedure n 1 root 2 left 3 right ΠΡΟ∆ΙΑΤΕΤΑΓΜΕΝΗ ∆ΙΑΠΕΡΑΣΗ
  29. 29. A. Θεωρία 4. ∆ιαπέραση ∆υαδικών ∆ένδρων 2. Υλοποίηση σε C: Προδιατεταγµένη ∆ιαδροµή 29∆ηµήτρης Ψούνης, ∆οµές ∆εδοµένων σε C, Μάθηµα 6: ∆υαδικά ∆ένδρα Παράδειγµα Εκτέλεσης της Προδιατεταγµένης ∆ιαδροµής στο ακόλουθο δένδρο: 10 146 1975 82 3 1 2 6 7 8 9 3 4 5 Παράγεται η ακολουθία (σειρά επίσκεψης): 10,6,5,2,3,7,8,14,19
  30. 30. A. Θεωρία 4. ∆ιαπέραση ∆υαδικών ∆ένδρων 2. Υλοποίηση σε C: Προδιατεταγµένη ∆ιαδροµή 30∆ηµήτρης Ψούνης, ∆οµές ∆εδοµένων σε C, Μάθηµα 6: ∆υαδικά ∆ένδρα Εµπειρικός Τρόπος (εκτέλεσης της προδιατεταγµένης διαπέρασης): • Κατασκευάζω το περίγραµµα και τραβάω γραµµή αριστερά από κάθε κόµβο. • Έπειτα σαρώνω το περίγραµµα αριστερόστροφα από τη ρίζα και όπου συναντάω γραµµή καταγράφω τον κόµβο 10 146 1975 82 3 Σειρά επίσκεψης: 10,6,5,2,3,7,8,14,19
  31. 31. A. Θεωρία 4. ∆ιαπέραση ∆υαδικών ∆ένδρων 2. Υλοποίηση σε C: Προδιατεταγµένη ∆ιαδροµή 31∆ηµήτρης Ψούνης, ∆οµές ∆εδοµένων σε C, Μάθηµα 6: ∆υαδικά ∆ένδρα /* TR_preorder(): Ektypwsi kata tin prodiatetagmeni diadromi */ void TR_preorder(TREE_PTR v) { if(v!=NULL) { TR_print_node(v); TR_preorder(v->left); TR_preorder(v->right); } }
  32. 32. A. Θεωρία 4. ∆ιαπέραση ∆υαδικών ∆ένδρων 3. Υλοποίηση σε C: Ενδο∆ιατεταγµένη ∆ιαπέραση 32∆ηµήτρης Ψούνης, ∆οµές ∆εδοµένων σε C, Μάθηµα 6: ∆υαδικά ∆ένδρα ------------------------------------------------------------- Αλγόριθµος Ενδοδιατεταγµένης ∆ιαδροµής (IN-ORDER) Είσοδος: ∆υαδικό ∆ένδρο Τ Έξοδος: Ενδοδιατεταγµένη ∆ιάσχιση των Κορυφών του Τ ------------------------------------------------------------- procedure IN-ORDER(v) Αν (v≠ΚΕΝΟ) IN-ORDER(Αριστερό Παιδί της v) Εκτύπωση του v IN-ORDER(∆εξί Παιδί της v) Τέλος-Αν end procedure n 2 root 1 left 3 right ΕΝ∆Ο∆ΙΑΤΕΤΑΓΜΕΝΗ ∆ΙΑΠΕΡΑΣΗ
  33. 33. A. Θεωρία 4. ∆ιαπέραση ∆υαδικών ∆ένδρων 3. Υλοποίηση σε C: Ενδο∆ιατεταγµένη ∆ιαπέραση 33∆ηµήτρης Ψούνης, ∆οµές ∆εδοµένων σε C, Μάθηµα 6: ∆υαδικά ∆ένδρα Παράδειγµα Εκτέλεσης της Ενδοδιατεταγµένης ∆ιαδροµής στο ακόλουθο δένδρο: Παράγεται η ακολουθία (σειρά επίσκεψης): 2,3,5,6,7,8,10,14,19 10 146 1975 82 3 7 4 5 6 8 9 3 1 2 Σηµείωση: Η ακολουθία εµφανίζεται σε αύξουσα σειρά γιατί το δένδρο έχει ειδική µορφή (∆υαδικό ∆ένδρο Αναζήτησης => Το µελετάµε στο επόµενο µάθηµα)
  34. 34. A. Θεωρία 4. ∆ιαπέραση ∆υαδικών ∆ένδρων 3. Υλοποίηση σε C: Ενδο∆ιατεταγµένη ∆ιαπέραση 34∆ηµήτρης Ψούνης, ∆οµές ∆εδοµένων σε C, Μάθηµα 6: ∆υαδικά ∆ένδρα Εµπειρικός Τρόπος (εκτέλεσης της ενδοδιατεταγµένης διαπέρασης): • Κατασκευάζω το περίγραµµα και τραβάω γραµµή κάτω από κάθε κόµβο. • Έπειτα σαρώνω το περίγραµµα αριστερόστροφα από τη ρίζα και όπου συναντάω γραµµή καταγράφω τον κόµβο Σειρά επίσκεψης: 2,3,5,6,7,8,10,14,19 10 146 1975 82 3
  35. 35. A. Θεωρία 4. ∆ιαπέραση ∆υαδικών ∆ένδρων 3. Υλοποίηση σε C: Ενδο∆ιατεταγµένη ∆ιαπέραση 35∆ηµήτρης Ψούνης, ∆οµές ∆εδοµένων σε C, Μάθηµα 6: ∆υαδικά ∆ένδρα /* TR_inorder(): Ektypwsi kata tin endodiatetagmeni diadromi */ void TR_inorder(TREE_PTR v) { if(v!=NULL) { TR_inorder(v->left); TR_print_node(v); TR_inorder(v->right); } }
  36. 36. A. Θεωρία 4. ∆ιαπέραση ∆υαδικών ∆ένδρων 5. Υλοποίηση σε C: Μετα∆ιατεταγµένη ∆ιαπέραση 36∆ηµήτρης Ψούνης, ∆οµές ∆εδοµένων σε C, Μάθηµα 6: ∆υαδικά ∆ένδρα ------------------------------------------------------------- Αλγόριθµος Μεταδιατεταγµένης ∆ιαδροµής (POST-ORDER) Είσοδος: ∆υαδικό ∆ένδρο Τ Έξοδος: Μεταδιατεταγµένη ∆ιάσχιση των Κορυφών του Τ ------------------------------------------------------------- procedure POST-ORDER(v) Αν (v≠ΚΕΝΟ) POST-ORDER(Αριστερό Παιδί της v) POST-ORDER(∆εξί Παιδί της v) Εκτύπωση του v Τέλος-Αν end procedure n 3 root 1 left 2 right ΜΕΤΑ∆ΙΑΤΕΤΑΓΜΕΝΗ ∆ΙΑΠΕΡΑΣΗ
  37. 37. A. Θεωρία 4. ∆ιαπέραση ∆υαδικών ∆ένδρων 4. Υλοποίηση σε C: Μετα∆ιατεταγµένη ∆ιαπέραση 37∆ηµήτρης Ψούνης, ∆οµές ∆εδοµένων σε C, Μάθηµα 6: ∆υαδικά ∆ένδρα Παράδειγµα Εκτέλεσης της Μεταδιατεταγµένης ∆ιαδροµής στο ακόλουθο δένδρο: Παράγεται η ακολουθία (σειρά επίσκεψης): 3,2,5,8,7,6,19,14,10 10 146 1975 82 3 9 6 5 4 8 7 3 2 1
  38. 38. A. Θεωρία 4. ∆ιαπέραση ∆υαδικών ∆ένδρων 4. Υλοποίηση σε C: Μετα∆ιατεταγµένη ∆ιαπέραση 38∆ηµήτρης Ψούνης, ∆οµές ∆εδοµένων σε C, Μάθηµα 6: ∆υαδικά ∆ένδρα Εµπειρικός Τρόπος (εκτέλεσης της ενδοδιατεταγµένης διαπέρασης): • Κατασκευάζω το περίγραµµα και τραβάω γραµµή δεξιά από κάθε κόµβο. • Έπειτα σαρώνω το περίγραµµα αριστερόστροφα από τη ρίζα και όπου συναντάω γραµµή καταγράφω τον κόµβο Σειρά επίσκεψης: 3,2,5,8,7,6,19,14,10 10 146 1975 82 3
  39. 39. A. Θεωρία 4. ∆ιαπέραση ∆υαδικών ∆ένδρων 4. Υλοποίηση σε C: Μετα∆ιατεταγµένη ∆ιαπέραση 39∆ηµήτρης Ψούνης, ∆οµές ∆εδοµένων σε C, Μάθηµα 6: ∆υαδικά ∆ένδρα /* TR_postorder(): Ektypwsi kata tin metadiatetagmeni diadromi */ void TR_postorder(TREE_PTR v) { if(v!=NULL) { TR_postorder(v->left); TR_postorder(v->right); TR_print_node(v); } }
  40. 40. Β. Ασκήσεις Εφαρµογή 1: Μελέτη Προγράµµατος ∆ηµήτρης Ψούνης, ∆οµές ∆εδοµένων σε C, Μάθηµα 6: ∆υαδικά ∆ένδρα 40 Μελετήστε το project tree.dev στο οποίο υλοποιούνται οι βασικές πράξεις των δένδρων που µελετήσαµε στο µάθηµα. Σε αυτό θα «πατήσουµε» στο επόµενο µάθηµα για να κατασκευάσουµε τα δυαδικά δένδρα αναζήτησης.

×