Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

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

2,566 views

Published on

.

Published in: Education
  • Be the first to comment

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

  1. 1. ∆οµές ∆εδοµένων σε C Μάθηµα 7: ∆υαδικά ∆ένδρα Αναζήτησης ∆ηµήτρης Ψούνης
  2. 2. Περιεχόµενα Μαθήµατος Α. Θεωρία 1. ∆υαδικό ∆ένδρο Αναζήτησης 1. Ορισµός ∆∆Α 2. Βασικές Πράξεις 3. Υλοποίηση σε C: Αναζήτηση σε ∆∆Α 4. Υλοποίηση σε C: Εισαγωγή σε ∆∆Α 5. Υλοποίηση σε C: ∆ιαγραφή σε ∆∆Α Β. Ασκήσεις 2∆ηµήτρης Ψούνης, ∆οµές ∆εδοµένων σε C, Μάθηµα 7: ∆υαδικά ∆ένδρα Αναζήτησης
  3. 3. A. Θεωρία 1. ∆υαδικό ∆ένδρο Αναζήτησης 1. Ορισµός ∆υαδικού ∆ένδρου Αναζήτησης 3∆ηµήτρης Ψούνης, ∆οµές ∆εδοµένων σε C, Μάθηµα 7: ∆υαδικά ∆ένδρα Αναζήτησης Το «∆υαδικό ∆ένδρο Αναζήτησης» (∆∆Α) είναι ένα δένδρο στο οποίο σε κάθε κόµβο έχει αποθηκευτεί µία τιµή v και επιπλέον: • Στις κορυφές του αριστερού υποδένδρου, έχουν αποθηκευτεί τιµές µικρότερες της v. • Στις κορυφές του δεξιού υποδένδρου έχουν αποθηκευτεί τιµές µεγαλύτερες της v. Σηµαντικό: Η ενδοδιατεταγµένη διαδροµή σε ένα ∆∆Α επιστρέφει τους αριθµούς του ∆∆Α σε αύξουσα σειρά Παραδείγµατα ∆υαδικών ∆ένδρων Αναζήτησης: 11 146 19134 5 2617 ∆∆Α που αποθηκεύει αριθµούς john ben pam alice eve max tom ∆∆Α που αποθηκεύει συµβολοσειρές
  4. 4. A. Θεωρία 1. ∆υαδικό ∆ένδρο Αναζήτησης 2. Βασικές Πράξεις 4∆ηµήτρης Ψούνης, ∆οµές ∆εδοµένων σε C, Μάθηµα 7: ∆υαδικά ∆ένδρα Αναζήτησης Οι βασικές πράξεις σε ένα δυαδικό δένδρο αναζήτησης (επεκτείνοντας το δυαδικό δένδρο) είναι: • Εισαγωγή ενός στοιχείου στο δένδρο (insert_BST) • Αναζήτηση ενός στοιχείου στο δένδρο (search_BST) • ∆ιαγραφή ενός στοιχείου από το δένδρο (delete_BST) Παρατήρηση: Επεκτείνουµε τον ορισµό του ∆υαδικού ∆ένδρου, αφού η εισαγωγή και η διαγραφή κόµβων από το ∆∆Α θα ακολουθούν κάποιο συγκεκριµένο αλγόριθµο, ώστε µετά από την εκτέλεση των πράξεων το δένδρο να εξακολουθεί να έχει την ιδιότητα του ∆∆Α.
  5. 5. A. Θεωρία 1. ∆υαδικό ∆ένδρο Αναζήτησης 3. Υλοποίηση σε C: Αναζήτηση σε ∆∆Α 5∆ηµήτρης Ψούνης, ∆οµές ∆εδοµένων σε C, Μάθηµα 7: ∆υαδικά ∆ένδρα Αναζήτησης Η συνάρτηση «Αναζήτηση» ψάχνει για το στοιχείο Χ στο δυαδικό δένδρο αναζήτησης και επιστρέφει ΝΑΙ/ΌΧΙ ανάλογα µε το αν το στοιχείο υπάρχει στο δένδρο: Σκιαγράφηση αλγορίθµου: Θέτει Κ = ρίζα του δένδρου Επανέλαβε όσο Κ ≠ KENO Αν (Χ = Κ) Επέστρεψε ΝΑΙ Αλλιώς αν (Χ > Κ) Θέσε Κ=δεξί παιδί της Κ. Αλλιώς αν (Χ < Κ) Θέσε Κ=αριστερό παιδί της Κ. Τέλος-Επανάληψης Επέστρεψε ΟΧΙ
  6. 6. A. Θεωρία 1. ∆υαδικό ∆ένδρο Αναζήτησης 3. Υλοποίηση σε C: Αναζήτηση σε ∆∆Α 6∆ηµήτρης Ψούνης, ∆οµές ∆εδοµένων σε C, Μάθηµα 7: ∆υαδικά ∆ένδρα Αναζήτησης Παράδειγµα Αναζήτησης του δεδοµένου 8 (κόκκινο χρώµα) και του 17 (µπλέ χρώµα) Αναζήτηση του 8: 10(αριστερά), 6(δεξιά), 7(δεξιά), 8 (βρέθηκε). Απάντηση: ΝΑΙ Αναζήτηση του 17: 10(δεξιά), 14 (δεξιά), 19(αριστερά). ΚΕΝΟ. Απάντηση: ΟΧΙ 10 146 1975 82 3
  7. 7. A. Θεωρία 1. ∆υαδικό ∆ένδρο Αναζήτησης 3. Υλοποίηση σε C: Αναζήτηση σε ∆∆Α 7∆ηµήτρης Ψούνης, ∆οµές ∆εδοµένων σε C, Μάθηµα 7: ∆υαδικά ∆ένδρα Αναζήτησης /* TR_search_BST(): anazitisi tou x sto DDA me riza root */ int TR_search_BST(TREE_PTR root, elem x) { TREE_PTR current; current=root; while (current!=NULL) { if (x == current->data) return TRUE; else if (x < current->data) current=current->left; else // x > current->data current=current->right; } return FALSE; }
  8. 8. A. Θεωρία 1. ∆υαδικό ∆ένδρο Αναζήτησης 4. Υλοποίηση σε C: Εισαγωγή σε ∆∆Α 8∆ηµήτρης Ψούνης, ∆οµές ∆εδοµένων σε C, Μάθηµα 7: ∆υαδικά ∆ένδρα Αναζήτησης Σκιαγράφηση αλγορίθµου: Αν Τ είναι άδειο, τοποθέτησε το x ως ρίζα. Επέστρεψε TRUE Θέσε Κ=ρίζα του δένδρου Επανέλαβε: Αν x==K Επέστρεψε FALSE Αλλιώς αν x<K Αν Κ δεν έχει αριστερό παιδί: Κατασκεύασε αριστερό παιδί της K με δεδομένο x. Επέστρεψε TRUE Αλλιώς Θέσε K=αριστερό παιδί του Κ. Αλλιώς // x>K Αν Κ δεν έχει δεξί παιδί: Κατασκεύασε δεξί παιδί του K με δεδομένο x. Επέστρεψε TRUE Αλλιώς Θέσε K=δεξί παιδί του Κ. Ο αλγόριθµος «Εισαγωγής σε ∆∆Α» δεδοµένου ενός ∆∆Α Τ και ενός δεδοµένου x: • Αν το x υπάρχει στο δένδρο Τ επιστρέφει FALSE • Αν το x δεν υπάρχει στο δένδρο Τ το εισάγει σε θέση που σέβεται το ∆∆Α.
  9. 9. A. Θεωρία 1. ∆υαδικό ∆ένδρο Αναζήτησης 4. Υλοποίηση σε C: Εισαγωγή σε ∆∆Α 9∆ηµήτρης Ψούνης, ∆οµές ∆εδοµένων σε C, Μάθηµα 7: ∆υαδικά ∆ένδρα Αναζήτησης Παράδειγµα Εισαγωγής του δεδοµένου 17 10 146 1975 82 3 10 146 1975 82 3 17
  10. 10. A. Θεωρία 1. ∆υαδικό ∆ένδρο Αναζήτησης 4. Υλοποίηση σε C: Εισαγωγή σε ∆∆Α 10∆ηµήτρης Ψούνης, ∆οµές ∆εδοµένων σε C, Μάθηµα 7: ∆υαδικά ∆ένδρα Αναζήτησης /* TR_insert_BST(): eisagwgi tou x sto DDA me riza root */ int TR_insert_BST(TREE_PTR *root, elem x) { TREE_PTR current; /* 1. Eisagwgi se adeio dentro */ if (*root==NULL) { TR_insert_root(root, x); return TRUE; } /* 2. Anazitisi + Eisagwgi sto dendro */ current=*root; while (1) { if (x == current->data) return FALSE;
  11. 11. A. Θεωρία 1. ∆υαδικό ∆ένδρο Αναζήτησης 4. Υλοποίηση σε C: Εισαγωγή σε ∆∆Α 11∆ηµήτρης Ψούνης, ∆οµές ∆εδοµένων σε C, Μάθηµα 7: ∆υαδικά ∆ένδρα Αναζήτησης else if (x < current->data) { if (current->left==NULL) { TR_insert_left(current,x); return TRUE; } else current=current->left; } else // x > current->data { if (current->right==NULL) { TR_insert_right(current,x); return TRUE; } else current=current->right; } } }
  12. 12. A. Θεωρία 1. ∆υαδικό ∆ένδρο Αναζήτησης 5. Υλοποίηση σε C: ∆ιαγραφή σε ∆∆Α 12∆ηµήτρης Ψούνης, ∆οµές ∆εδοµένων σε C, Μάθηµα 7: ∆υαδικά ∆ένδρα Αναζήτησης Ο αλγόριθµος «∆ιαγραφής σε ∆∆Α» παίρνει ως όρισµα ένα δένδρο Τ και ένα δεδοµένο x (που υπάρχει στο δένδρο) και ξεχωρίζει 3 περιπτώσεις: • Αν ο κόµβος του x δεν έχει παιδιά, τότε διαγράφουµε τον κόµβο. 10 146 1975 82 3 Παράδειγµα: ∆ιαγραφή του «8» ΠΡΙΝ 10 146 1975 2 3 ΜΕΤΑ
  13. 13. A. Θεωρία 1. ∆υαδικό ∆ένδρο Αναζήτησης 5. Υλοποίηση σε C: ∆ιαγραφή σε ∆∆Α 13∆ηµήτρης Ψούνης, ∆οµές ∆εδοµένων σε C, Μάθηµα 7: ∆υαδικά ∆ένδρα Αναζήτησης • Αν ο κόµβος του x έχει ένα παιδί, τότε διαγράφουµε τον κόµβο και το παιδί του τον αντικαθιστά. 10 146 1975 82 3 Παράδειγµα: ∆ιαγραφή του «5» ΠΡΙΝ ΜΕΤΑ 10 146 197 8 2 3
  14. 14. A. Θεωρία 1. ∆υαδικό ∆ένδρο Αναζήτησης 5. Υλοποίηση σε C: ∆ιαγραφή σε ∆∆Α 14∆ηµήτρης Ψούνης, ∆οµές ∆εδοµένων σε C, Μάθηµα 7: ∆υαδικά ∆ένδρα Αναζήτησης • Αν ο κόµβος του x έχει δύο παιδιά, τότε: Βρίσκουµε τον επόµενο στην ενδοδιατεταγµένη διαδροµή και αντικαθιστούµε τον x µε αυτόν. • Περίπτωση 1: Το δεξί παιδί του x δεν έχει αριστερό παιδί • Τότε ο x αντικαθίσταται από το δεξί παιδί του (που διατηρεί το δεξί υποδένδρο του). 10 146 1975 82 3 Παράδειγµα: ∆ιαγραφή του «6» ΠΡΙΝ ΜΕΤΑ 10 147 1985 2 3
  15. 15. A. Θεωρία 1. ∆υαδικό ∆ένδρο Αναζήτησης 5. Υλοποίηση σε C: ∆ιαγραφή σε ∆∆Α 15∆ηµήτρης Ψούνης, ∆οµές ∆εδοµένων σε C, Μάθηµα 7: ∆υαδικά ∆ένδρα Αναζήτησης • Αν ο κόµβος του x έχει δύο παιδιά, τότε: Βρίσκουµε τον επόµενο στην ενδοδιατεταγµένη διαδροµή (y) και αντικαθιστούµε τον x µε αυτόν. • Περίπτωση 2: Το δεξί παιδί του x έχει αριστερό παιδί • Ο y παίρνει τη θέση του x • Ο κόµβος του y αντικαθίσταται από το δεξί υποδένδρο του y Παράδειγµα: ∆ιαγραφή του «10» ΠΡΙΝ ΜΕΤΑ 10 147 19135 2 11 12 11 147 19135 2 12
  16. 16. A. Θεωρία 1. ∆υαδικό ∆ένδρο Αναζήτησης 5. Υλοποίηση σε C: ∆ιαγραφή σε ∆∆Α 16∆ηµήτρης Ψούνης, ∆οµές ∆εδοµένων σε C, Μάθηµα 7: ∆υαδικά ∆ένδρα Αναζήτησης /* TR_delete_BST(): diagrafi tou x apo to DDA me riza root */ int TR_delete_BST(TREE_PTR *root, elem x) { TREE_PTR current, parent, nextOrdered; int p; /* 1. deksi paidi, 2. aristero paidi tou current */ int temp; /* 1. Anazitisi tou komvou */ parent=NULL; current=*root; while (current!=NULL) { if (x == current->data) break; else if (x < current->data) { parent=current; p=1; current=current->left; }
  17. 17. A. Θεωρία 1. ∆υαδικό ∆ένδρο Αναζήτησης 5. Υλοποίηση σε C: ∆ιαγραφή σε ∆∆Α 17∆ηµήτρης Ψούνης, ∆οµές ∆εδοµένων σε C, Μάθηµα 7: ∆υαδικά ∆ένδρα Αναζήτησης else // x > current->data { parent=current; p=2; current=current->right; } } if (current==NULL) return FALSE; /* 2.1 An den exei paidia */ if (current->left==NULL && current->right==NULL) { free(current); if (parent==NULL) *root=NULL; else if (p==1) parent->left=NULL; else parent->right=NULL; return TRUE; }
  18. 18. A. Θεωρία 1. ∆υαδικό ∆ένδρο Αναζήτησης 5. Υλοποίηση σε C: ∆ιαγραφή σε ∆∆Α 18∆ηµήτρης Ψούνης, ∆οµές ∆εδοµένων σε C, Μάθηµα 7: ∆υαδικά ∆ένδρα Αναζήτησης /* 2.2 Exei mono aristero paidi */ else if (current->left!=NULL && current->right==NULL) { if (parent==NULL) *root=current->left; else if (p==1) parent->left=current->left; else parent->right=current->left; free(current); return TRUE; } /* 2.3 Exei mono deksi paidi */ else if (current->left==NULL && current->right!=NULL) { if (parent==NULL) *root=current->right; else if (p==1) parent->left=current->right; else parent->right=current->right;
  19. 19. A. Θεωρία 1. ∆υαδικό ∆ένδρο Αναζήτησης 5. Υλοποίηση σε C: ∆ιαγραφή σε ∆∆Α 19∆ηµήτρης Ψούνης, ∆οµές ∆εδοµένων σε C, Μάθηµα 7: ∆υαδικά ∆ένδρα Αναζήτησης free(current); return TRUE; } /* 2.4 Exei aristero kai deksi paidi */ else { /* 2.4.1 Vriskei ton epomeno stin endodiatetagmeni */ p=1; nextOrdered=current->right; while (nextOrdered->left!=NULL) { parent=nextOrdered; nextOrdered=nextOrdered->left; p=2; } /*2.4.2 Antallassei times me ton komvo pou diagrafetai */ current->data=nextOrdered->data;
  20. 20. A. Θεωρία 1. ∆υαδικό ∆ένδρο Αναζήτησης 5. Υλοποίηση σε C: ∆ιαγραφή σε ∆∆Α 20∆ηµήτρης Ψούνης, ∆οµές ∆εδοµένων σε C, Μάθηµα 7: ∆υαδικά ∆ένδρα Αναζήτησης /*2.4.3 Diagrafei ton komvo */ if (p==1) /*2.4.3.1 O epomenos einai to deksi paidi */ { current->right=nextOrdered->right; free(nextOrdered); } else { parent->left=nextOrdered->right; free(nextOrdered); } } }
  21. 21. Β. Ασκήσεις Εφαρµογή 1: Μελέτη Προγράµµατος ∆ηµήτρης Ψούνης, ∆οµές ∆εδοµένων σε C, Μάθηµα 7: ∆υαδικά ∆ένδρα Αναζήτησης 21 Μελετήστε το project tree.dev στο οποίο υλοποιούνται οι βασικές πράξεις των δυαδικών δένδρων αναζήτησης που µελετήσαµε στο µάθηµα.
  22. 22. Β. Ασκήσεις Εφαρµογή 2: Εκτέλεση «µε το χέρι» ∆ηµήτρης Ψούνης, ∆οµές ∆εδοµένων σε C, Μάθηµα 7: ∆υαδικά ∆ένδρα Αναζήτησης 22 1. Εισάγετε τα ακόλουθα δεδοµένα σε ένα ∆∆Α: «10 6 3 9 12 5 4 2 1 8». 2. ∆ιαγράψτε τον κόµβο 12 3. Εισάγετε τον κόµβο 7
  23. 23. Β. Ασκήσεις Εφαρµογή 2: Εκτέλεση «µε το χέρι» ∆ηµήτρης Ψούνης, ∆οµές ∆εδοµένων σε C, Μάθηµα 7: ∆υαδικά ∆ένδρα Αναζήτησης 23 4. ∆ιαγράψτε τον κόµβο 3 5. ∆ώστε την ενδοδιατεταγµένη διαπέραση του δένδρου 6. Κατασκεύαστε πλήρες δυαδικό δένδρο αναζήτησης που να περιέχει τα περιεχόµενα του δένδρου .

×