EPL231: Δομές Δεδομένων και Αλγόριθμοι Εργαστήριο 5 Αναδρομική διεργασία εισαγωγής καινούριου κόμβου σε ΔΔΑ με αλφαβητική σειρά Αναδρομή Η αναδρομή εμφανίζεται όταν μία διεργασία καλεί τον εαυτό της Υπάρχουν δύο μέρη Μία τερματική κατάσταση π.χ. i==0 Μία αναδρομική κατάσταση όπου η διεργασία καλεί τον εαυτό της με διαφορετικούς παραμέτρους 1/3/2010 ΕΠΛ231-Δομές Δεδομένων και Αλγόριθμοι 2
Παράδειγμα αναδρομής Ησυνάρτησηint power(int x, int pow) Επιτρέπεται μόνο η χρήση του πολλαπλασιασμού Επιστρέφει το x pow Ησκέψη x 0 =1 x 2 =x x (x 1 x 1 ) x 5 =x x x x x (x 4 x) 1/3/2010 ΕΠΛ231-Δομές Δεδομένων και Αλγόριθμοι 3 Παράδειγμα αναδρομής (συνέχεια) Ποια είναι η τερματική κατάσταση; pow==0 όπου η συνάρτηση επιστρέφει 1 Άρα κάπου στον κώδικα θα υπάρχει ιf(pow==0) return 1; Ποια είναι η αναδρομική κατάσταση; pow!=0, τι γίνεται σε αυτή την περίπτωσή; Πρέπει με κάποιο τρόπο να φτάσουμε στο pow=0. Αυτό γίνεται π.χ. αν αφαιρούμε 1 από το pow κάθε φορά 1/3/2010 ΕΠΛ231-Δομές Δεδομένων και Αλγόριθμοι 4
Παράδειγμα αναδρομής (συνέχεια) Άρα κάπου θα έχουμε κάλεσμα της συνάρτησης με pow-1 Δεδομένο: κάθε φορά θέλουμε να πολλαπλασιάζουμε το x. Βάζοντας μαζί ότι σκεφτήκαμε: int power(int x, int pow){ ιf(pow==0) return 1; else return x*power( x, (pow-1) ) 1/3/2010 ΕΠΛ231-Δομές Δεδομένων και Αλγόριθμοι 5 Power(3, 4) Return 3*power(3,(4-1)) power(3,(4-1)) Return 3*power(3, 2) Return 3*power(3,3) Return 3* 3*power(3, 2) Return 3* 3*3*power(3, 1) Return 3*3*3*3*power(3, 0) 1/3/2010 ΕΠΛ231-Δομές Δεδομένων και Αλγόριθμοι 6
Δυαδικό Δέντρο Αναζήτησης με Αλφαβητική Σειρά ΜετάαπόεισαγωγήτουD, C, F, H Τι διαφέρει αν αρχίζαμε από την αρχή και η σειρά εισαγωγής ήταν: 1. D, F, C, H 2. D, C, H, F 3. C, D, F, H D,2 C,0 F,1 H,0 char, int Ένας χαρακτήρας του αγγλικού αλφαβήτου Ακέραιος αριθμός που αντιπροσωπεύει το ύψος του κόμβο. 1/3/2010 ΕΠΛ231-Δομές Δεδομένων και Αλγόριθμοι 7 ΠΑΡΑΔΕΙΓΜΑ ΕΚΤΕΛΕΣΗΣ Εισαγωγή των κόμβων D,C,F,H,A,E,B,G
Εισαγωγή των κόμβων D,C,F,H,A,E,B,G Εισαγωγή του κόμβου D D,0 1/3/2010 ΕΠΛ231-Δομές Δεδομένων και Αλγόριθμοι 9 Εισαγωγή των κόμβων D,C,F,H,A,E,B,G Εισαγωγή του κόμβου C D,1 C,0 1/3/2010 ΕΠΛ231-Δομές Δεδομένων και Αλγόριθμοι 10
Εισαγωγή των κόμβων D,C,F,H,A,E,B,G Εισαγωγή του κόμβου F D,1 C,0 F,0 1/3/2010 ΕΠΛ231-Δομές Δεδομένων και Αλγόριθμοι 11 Εισαγωγή των κόμβων D,C,F,H,A,E,B,G Εισαγωγή του κόμβου H D,2 C,0 F,1 H,0 1/3/2010 ΕΠΛ231-Δομές Δεδομένων και Αλγόριθμοι 12
Εισαγωγή των κόμβων D,C,F,H,A,E,B,G Εισαγωγή του κόμβου A D,2 C,1 F,1 A,0 H,0 1/3/2010 ΕΠΛ231-Δομές Δεδομένων και Αλγόριθμοι 13 Εισαγωγή των κόμβων D,C,F,H,A,E,B,G Εισαγωγή του κόμβου E D,2 C,1 F,1 A,0 E,0 H,0 1/3/2010 ΕΠΛ231-Δομές Δεδομένων και Αλγόριθμοι 14
Εισαγωγή των κόμβων D,C,F,H,A,E,B,G Εισαγωγή του κόμβου B D,3 C,2 F,1 A,1 E,0 H,0 B,0 1/3/2010 ΕΠΛ231-Δομές Δεδομένων και Αλγόριθμοι 15 Εισαγωγή των κόμβων D,C,F,H,A,E,B,G Εισαγωγή του κόμβου G D,3 C,2 F,2 A,1 E,0 H,1 B,0 G,0 1/3/2010 ΕΠΛ231-Δομές Δεδομένων και Αλγόριθμοι 16
Δομές (Structures) typedef struct tnode{ char name; int height; struct tnode *left; //Το αριστερό παιδί struct tnode *right; //Το δεξί παιδί tnode; typedef struct tnode *Tnode; //το όνομα του κόμβου //το ύψος του κόμβου 1/3/2010 ΕΠΛ231-Δομές Δεδομένων και Αλγόριθμοι 17 Συναρτήσεις για υλοποίηση int max(tnode left, Tnode right) επιστρέφει το μέγιστο ύψος 2 υποδένδρων Tnode Insert(Tnode t, char c) εισάγει ένα καινούριο κόμβο με το όνομα c στο δέντρο t στην σωστή θέση και επιστρέφει την ανάθεση αυτή void printtree(tnode t) τυπώνει το δέντρο t. 1/3/2010 ΕΠΛ231-Δομές Δεδομένων και Αλγόριθμοι 18
max If left==null && right==null Else If left==null && right!=null Else If left!=null && right==null 1/3/2010 ΕΠΛ231-Δομές Δεδομένων και Αλγόριθμοι 19 Λύσεις Δομή //The Binary Tree structure typedef struct tnode{ int height; char name; struct tnode *left; struct tnode *right; tnode; //Pointer to the tree structure typedef struct tnode *Tree; 1/3/2010 ΕΠΛ231-Δομές Δεδομένων και Αλγόριθμοι 20
Λύσεις συναρτήσεων int max(tree left, Tree right){ if(left==null && right==null) return 0; if(left==null) return right->height; if(right==null) return left->height; if(left->height < right->height) return right->height; else return left->height; 1/3/2010 ΕΠΛ231-Δομές Δεδομένων και Αλγόριθμοι 21 Λύσεις συναρτήσεων (συνέχεια) Tree Insert(Tree t, char c){ if(t==null){ //Initialize a new node printf("inserting new node (%c:0).\n", c); t = (tree*) malloc ( sizeof( tree ) ); t->height=0; t->name = c; t->left = NULL; t->right = NULL; return t; 1/3/2010 ΕΠΛ231-Δομές Δεδομένων και Αλγόριθμοι 22
Λύσεις συναρτήσεων (συνέχεια) else{ printf("current Node\nName: %c\nheight: %d\n", t->name, t->height); if(c < t->name){ //Move to the left printf("moving to the left of node (%c:%d)\n", t->name, t->height); t->left = Insert(t->left, c); else{ //Movetotheright printf("moving to the right of node (%c:%d)\n", t->name, t->height); t->right = Insert(t->right, c); //Set the height t->height = 1 + max(t->left, t->right); return t; 1/3/2010 ΕΠΛ231-Δομές Δεδομένων και Αλγόριθμοι 23 Λύσεις συναρτήσεων (συνέχεια) void printtree(tree t, int h){ int i; if(t!=null){ printtree(t->left, h-1); for(i=0; i<h*10; i++) printf(" "); printf("(%c:%d)\n", t->name, t->height); printtree(t->right, h-1); 1/3/2010 ΕΠΛ231-Δομές Δεδομένων και Αλγόριθμοι 24
Λύσεις συναρτήσεων (συνέχεια) Βοηθητική συνάρτηση void InsertNewNode(Tree t, char c){ printf("trying to insert new node with name [%c]\n", c); root = Insert(root, c); printf("done\n\n"); 1/3/2010 ΕΠΛ231-Δομές Δεδομένων και Αλγόριθμοι 25 The End