Κώστας Στεργίου Λέκτορας Τμήμα Μηχανικών ...

47
ΤΜΗΜΑ ΜΠΕΣ 1 Διακριτά Μαθηματικά ΙI Δέντρα Αναζήτησης Κώστας Στεργίου Λέκτορας Τμήμα Μηχανικών Πληροφοριακών & Επικοινωνιακών Συστημάτων Πανεπιστήμιο Αιγαίου e-mail: [email protected]

description

Διακριτά Μαθηματικά Ι I Δέντρα Αναζήτησης. Κώστας Στεργίου Λέκτορας Τμήμα Μηχανικών Πληροφοριακών & Επικοινωνιακών Συστημάτων Πανεπιστήμιο Αιγαίου e-mail: [email protected]. Δυαδικά Δέντρα Αναζήτησης. Ένας τρόπος αναπαράστασης μιας ταξινομημένης λίστας αντικειμένων . - PowerPoint PPT Presentation

Transcript of Κώστας Στεργίου Λέκτορας Τμήμα Μηχανικών ...

Page 1: Κώστας Στεργίου Λέκτορας Τμήμα Μηχανικών  Πληροφοριακών & Επικοινωνιακών Συστημάτων

ΤΜΗΜΑ ΜΠΕΣ 1

Διακριτά Μαθηματικά ΙIΔέντρα Αναζήτησης

Κώστας Στεργίου

Λέκτορας

Τμήμα Μηχανικών

Πληροφοριακών & Επικοινωνιακών Συστημάτων

Πανεπιστήμιο Αιγαίου

e-mail: [email protected]

Page 2: Κώστας Στεργίου Λέκτορας Τμήμα Μηχανικών  Πληροφοριακών & Επικοινωνιακών Συστημάτων

ΤΜΗΜΑ ΜΠΕΣ 2

Δυαδικά Δέντρα Αναζήτησης

Ένας τρόπος αναπαράστασης μιας ταξινομημένης λίστας αντικειμένων.

Υποστηρίζει τις παρακάτω διεργασίες σε γρήγορο χρόνο (Θ(log n) πολυπλοκότητα μέσης περίπτωσης, όπως θα δούμε αργότερα): Αναζήτηση ενός υπάρχοντος αντικειμένου. Εισαγωγή ενός καινούργιου αντικειμένου, αν δεν είναι ήδη παρόν.

Υποστηρίζει την εκτύπωση όλων των αντικειμένων σε Θ(n) χρόνο

Η εισαγωγή ενός αντικειμένου σε μια συνεχόμενη ακολουθία ai είναι πιο ακριβή (Θ(n) στη χειρότερη περίπτωση).

Page 3: Κώστας Στεργίου Λέκτορας Τμήμα Μηχανικών  Πληροφοριακών & Επικοινωνιακών Συστημάτων

ΤΜΗΜΑ ΜΠΕΣ 3

Δυαδικά Δέντρα Αναζήτησης

Τα αντικείμενα αποθηκεύονται σε κόμβους του δέντρου. Το δέντρο είναι οργανωμένο κατά τέτοιο τρόπο ώστε να ισχύει πάντα το παρακάτω:

Για κάθε αντικείμενο x, Το κλειδί κάθε κόμβου στο αριστερό υποδέντρο του x είναι μικρότερο του κλειδιού του x. Το κλειδί κάθε στο δεξιό υποδέντρο του x είναι μεγαλύτερο του κλειδιού του x.

7

3 12

1 5 9 15

0 2 8 11

Παράδειγμα:

Page 4: Κώστας Στεργίου Λέκτορας Τμήμα Μηχανικών  Πληροφοριακών & Επικοινωνιακών Συστημάτων

ΤΜΗΜΑ ΜΠΕΣ 4

Δέντρα Απόφασης

Ένα δυαδικό δέντρο αναζήτησης είναι μια ειδική κατηγορία ενός δέντρου απόφασης

Ένα δέντρο απόφασης (decision tree) αναπαριστά μια διαδικασία λήψης απόφασης. Κάθε πιθανό “σημείο απόφασης” ή κατάσταση

αναπαριστάται από έναν κόμβο. Κάθε πιθανή επιλογή που μπορεί να γίνει σε ένα σημείο

απόφασης αναπαριστάται με μια ακμή προς έναν κόμβο-παιδί.

Σε εκτεταμένα δέντρα απόφασης που χρησιμοποιούνται στην ανάλυση αποφάσεων, συμπεριλαμβάνονται κόμβοι που αναπαριστούν τυχαία γεγονότα και τα αποτελέσματα τους.

Page 5: Κώστας Στεργίου Λέκτορας Τμήμα Μηχανικών  Πληροφοριακών & Επικοινωνιακών Συστημάτων

ΤΜΗΜΑ ΜΠΕΣ 5

Πρόβλημα Ζύγισης Κερμάτων

Υποθέστε ότι έχετε 8 κέρματα, ένα εκ των οποίων είναι πλαστό και ελαφρύτερο από τα άλλα, και μια ζυγαριά όπως η διπλανή. Δε χρειάζεται ζυγαριά που μετράει

ακριβές βάρος για να λυθεί αυτό το πρόβλημα!

Πόσες ζυγίσεις απαιτούνται για να είστε σίγουροι ότι βρέθηκε το πλαστό νόμισμα?

?

Page 6: Κώστας Στεργίου Λέκτορας Τμήμα Μηχανικών  Πληροφοριακών & Επικοινωνιακών Συστημάτων

ΤΜΗΜΑ ΜΠΕΣ 6

Ως Πρόβλημα Δέντρου Απόφασης

Σε κάθε κατάσταση, διαλέγουμε δύο διακριτά και ίσου μεγέθους υποσύνολα κερμάτων για να βάλουμε στη ζυγαριά.

Το βάρος “αποφασίζει” αν θα γείρει αριστερά, δεξιά, ή θα ισορροπήσει.

Μια δεδομένη ακολουθίαζυγισμάτων δίνει έναδέντρο απόφασης μεπαράγοντα διακλάδωσης 3.

Page 7: Κώστας Στεργίου Λέκτορας Τμήμα Μηχανικών  Πληροφοριακών & Επικοινωνιακών Συστημάτων

ΤΜΗΜΑ ΜΠΕΣ 7

Εφαρμόζοντας το Θεώρημα Ύψους Δέντρων

Το δέντρο απόφασης πρέπει να έχει τουλάχιστον 8 φύλλα, μια και υπάρχουν 8 πιθανά αποτελέσματα. Σε σχέση με το ποιο νόμισμα είναι το πλαστό.

Το θεώρημα ύψους δέντρου μας λέει, h≥logm. Όπου και m είναι το πλήθος των φύλλων και ο παράγοντας

διακλάδωσης αντίστοιχα Οπότε το δέντρο απόφασης πρέπει να έχει ύψος

h ≥ log38 = 1.893… = 2.

Ας δούμε αν μπορούμε να λύσουμε το πρόβλημα με μόνο 2 ζυγίσεις…

Page 8: Κώστας Στεργίου Λέκτορας Τμήμα Μηχανικών  Πληροφοριακών & Επικοινωνιακών Συστημάτων

ΤΜΗΜΑ ΜΠΕΣ 8

Γενική Στρατηγική Επίλυσης

Το πρόβλημα είναι παράδειγμα αναζήτησης ενός μοναδικού συγκεκριμένου αντικειμένου, ανάμεσα σε μια λίστα από n φαινομενικά ίδια αντικείμενα.

Κάτι ανάλογο του “ψάχνοντας καρφίτσα σε αχυρώνα.”

Χρησιμοποιώντας τη ζυγαριά, μπορούμε να επιτεθούμε στο πρόβλημα με μια διαίρει-και-βασίλευε στρατηγική, παρόμοια με αυτή στη δυαδική αναζήτηση.

Θέλουμε να μειώσουμε το σύνολο των πιθανών σημείων όπου το αντικείμενο που ψάχνουμε (νόμισμα) μπορεί να βρεθεί από n σε μόνο 1, με έναν λογαριθμικό τρόπο.

Κάθε ζύγιση έχει 3 πιθανά αποτελέσματα. Μπορούμε να το χρησιμοποιήσουμε αυτό ώστε κάθε φορά να διαιρούμε τον εναπομείναντα

χώρο αναζήτησης σε τρία τμήματα

Αυτή η στρατηγική θα οδηγήσει στο ελάχιστο πιθανό πλήθος ζυγίσεων που απαιτούνται

Page 9: Κώστας Στεργίου Λέκτορας Τμήμα Μηχανικών  Πληροφοριακών & Επικοινωνιακών Συστημάτων

ΤΜΗΜΑ ΜΠΕΣ 9

Γενική Στρατηγική Επίλυσης

Σε κάθε βήμα, βάλε n/3 των n νομισμάτων προς εξέταση σε κάθε πλευρά της ζυγαριάς. Αν η ζυγαριά κλίνει προς τα αριστερά, τότε:

Το ελαφρύ πλαστό βρίσκεται στο δεξιό υποσύνολο n/3 ≈ n/3 νομισμάτων. Αν η ζυγαριά κλίνει προς τα δεξιά, τότε:

Το ελαφρύ πλαστό βρίσκεται στο αριστερό υποσύνολο n/3 ≈ n/3 νομισμάτων.

Αν η ζυγαριά ισορροπήσει τότε: Το ελαφρύ πλαστό βρίσκεται στα εναπομείναντα n − 2n/3≈ n/3 νομίσματα

που δε ζυγίσαμε!

Μπορεί να αποδειχθεί ότι η στρατηγική αυτή οδηγεί σε ισορροπημένο 3-δικό δέντρο.

Page 10: Κώστας Στεργίου Λέκτορας Τμήμα Μηχανικών  Πληροφοριακών & Επικοινωνιακών Συστημάτων

ΤΜΗΜΑ ΜΠΕΣ 10

Δέντρο Απόφασης Ζύγισης Νομισμάτων

Στη δική μας περίπτωση το δέντρο έχει την παρακάτω μορφή:

123 vs 456

1 vs. 2

δεξιά:123 ισορροπία:

78αριστερά:456

7 vs. 84 vs. 5

Α:1 Δ:2 Ι:3 Α:4 Δ:5 Ι:6 Α:7 Δ:8

Page 11: Κώστας Στεργίου Λέκτορας Τμήμα Μηχανικών  Πληροφοριακών & Επικοινωνιακών Συστημάτων

ΤΜΗΜΑ ΜΠΕΣ 11

Δέντρα Αναζήτησης

Binary Search Tree (BST): Ορισμοί BST Δομή Δεδομένων BST Λειτουργίες

findMin, findMax find insert remove

Page 12: Κώστας Στεργίου Λέκτορας Τμήμα Μηχανικών  Πληροφοριακών & Επικοινωνιακών Συστημάτων

ΤΜΗΜΑ ΜΠΕΣ 12

Δυαδικά Δέντρα

Ένα δυαδικό δέντρο (binary tree) είναι ένα δέντρο όπου κάθε κόμβος έχει το πολύ δύο παιδιά δηλαδή κάθε κόμβος έχει 0, ή 1, ή 2 παιδιά

binary tree

Page 13: Κώστας Στεργίου Λέκτορας Τμήμα Μηχανικών  Πληροφοριακών & Επικοινωνιακών Συστημάτων

ΤΜΗΜΑ ΜΠΕΣ 13

Δυαδικό Δέντρο Αναζήτησης

Ένα δυαδικό δέντρο αναζήτησης (binary search tree) (BST) είναι ένα δυαδικό δέντρο όπου για κάθε κόμβο X,

Όλοι οι κόμβοι στο αριστερό υποδέντρο του X περιέχουν κλειδί < από το κλειδί του X

Όλοι οι κόμβοι στο δεξιό υποδέντρο του X περιέχουν κλειδί > από το κλειδί του X

Οι κανόνες 1 και 2 είναι γνωστοί ως η ιδιότητα BST Το κλειδί ενός κόμβου είναι η τιμή του δεδομένου που

αποθηκεύει

Page 14: Κώστας Στεργίου Λέκτορας Τμήμα Μηχανικών  Πληροφοριακών & Επικοινωνιακών Συστημάτων

ΤΜΗΜΑ ΜΠΕΣ 14

Δυαδικό Δέντρο Αναζήτησης – Παράδειγμα

9

7

4

17

14

11

12

21

25

2722

• Η BST ιδιότητα ισχύει σε κάθε κόμβο

Page 15: Κώστας Στεργίου Λέκτορας Τμήμα Μηχανικών  Πληροφοριακών & Επικοινωνιακών Συστημάτων

ΤΜΗΜΑ ΜΠΕΣ 15

Κλειδιά Κόμβων Δέντρου Αναζήτησης

Θα χρησιμοποιήσουμε κλειδιά που είναι ακέραιοι αριθμοί Μπορούμε να χειριστούμε μη-ακέραια κλειδιά με παρόμοιο

τρόπο

Γενικά σε κάθε κόμβο του δέντρου μπορεί εκτός από το κλειδί να περιέχονται και άλλες πληροφορίες. Π.χ. ΑΜ: int (κλειδί)

Όνομα: string

Ημερομηνία Γέννησης: date

κτλ.

Page 16: Κώστας Στεργίου Λέκτορας Τμήμα Μηχανικών  Πληροφοριακών & Επικοινωνιακών Συστημάτων

ΤΜΗΜΑ ΜΠΕΣ 16

Βασική Δομή Δεδομένων Δέντρου Αναζήτησης

Όπως και σε ένα γενικό δέντρο, η βασική δομή δεδομένων σε ένα BST είναι ένας κόμβος που ονομάζουμε BinaryNode

Αντίθετα με τα γενικά δέντρα όπου το πλήθος των παιδιών κάθε κόμβου δεν είναι γνωστό στατικά, ένας BST κόμβος μπορεί να έχει το πολύ δύο παιδιά

Οπότε, είναι λογικό να χρησιμοποιήσουμε δύο δείκτες lchild (left-child) και rchild (right-child) υποθέτουμε ότι οι δείκτες των φύλλων είναι NULL

Page 17: Κώστας Στεργίου Λέκτορας Τμήμα Μηχανικών  Πληροφοριακών & Επικοινωνιακών Συστημάτων

ΤΜΗΜΑ ΜΠΕΣ 17

Βασική Δομή Δεδομένων Δέντρου Αναζήτησης

class BinaryNode{

private:

int key; // the integer key

BinaryNode *lchild; // pointer to left child

BinaryNode *rchild; // pointer to right child

public:

// public methods go here

}

Page 18: Κώστας Στεργίου Λέκτορας Τμήμα Μηχανικών  Πληροφοριακών & Επικοινωνιακών Συστημάτων

ΤΜΗΜΑ ΜΠΕΣ 18

Λειτουργίες σε Δέντρα Αναζήτησης

Οι βασικές λειτουργίες σε ένα BST είναι: findMin: βρες το ελάχιστο κλειδί μέσα στο BST findMax: βρες το μέγιστο κλειδί μέσα στο BST find(x): βρες το κλειδί ‘x’ μέσα στο BST insert(x): εισήγαγε το κλειδί ‘x’ μέσα στο BST remove(x): διέγραψε το κλειδί ‘x’ από το BST isEmpty: δες αν το BST είναι άδειο makeEmpty: άδειασε το BST printTree: τύπωσε όλα τα κλειδιά στο BST

Page 19: Κώστας Στεργίου Λέκτορας Τμήμα Μηχανικών  Πληροφοριακών & Επικοινωνιακών Συστημάτων

ΤΜΗΜΑ ΜΠΕΣ 19

findMin

Σε ένα δέντρο όλες οι διασχίσεις αρχίζουν από τη ρίζα Σύμφωνα με την BST ιδιότητα, το κλειδί του lchild της ρίζας

θα είναι < του κλειδιού της ρίζας Το κλειδί του lchild του lchild της ρίζας θα είναι < του

κλειδιού του lchild της ρίζας κ.ο.κ. Αν μια διάσχιση ενός BST αρχίσει στη ρίζα και «πηγαίνει

συνέχεια αριστερά» καθώς κατεβαίνει προς τα κάτω, ο τελευταίος κόμβος στη διάσχιση θα έχει το μικρότερο κλειδί στο δέντρο

Page 20: Κώστας Στεργίου Λέκτορας Τμήμα Μηχανικών  Πληροφοριακών & Επικοινωνιακών Συστημάτων

ΤΜΗΜΑ ΜΠΕΣ 20

findMin

Η παράμετρος εισόδου στη findMin μέθοδο είναι η ρίζα του BST findMin(root);

Η findMin μέθοδος επιστρέφει τον κόμβο που περιέχει το μικρότερο κλειδί στο BST

Έτσι, ο τύπος που επιστρέφει η findMin είναι BinaryNode*

Page 21: Κώστας Στεργίου Λέκτορας Τμήμα Μηχανικών  Πληροφοριακών & Επικοινωνιακών Συστημάτων

ΤΜΗΜΑ ΜΠΕΣ 21

findMin Algorithm

Βήματα αλγορίθμου: Ξεκίνα από τη ρίζα Αν η ρίζα είναι NULL (άδειο BST) επέστρεψε NULL Σε κάθε κόμβο πήγαινε στο lchild Ολοκλήρωσε τη διάσχιση όταν συναντηθεί ο πρώτος NULL δείκτης Επέστρεψε τον τελευταίο κόμβο που επισκέφτηκες

Ο αλγόριθμος μπορεί να υλοποιηθεί αναδρομικά ή μη-αναδρομικά

Page 22: Κώστας Στεργίου Λέκτορας Τμήμα Μηχανικών  Πληροφοριακών & Επικοινωνιακών Συστημάτων

ΤΜΗΜΑ ΜΠΕΣ 22

findMin Algorithm (με αναδρομή)

// Recursive algorithm

BinaryNode* findMin(BinaryNode *t){

// check if the tree is empty

if (t==NULL) return NULL;

// if the left child is null

// return the current node

if (t->lchild==NULL) return t;

return findMin (t->lchild);

}

Page 23: Κώστας Στεργίου Λέκτορας Τμήμα Μηχανικών  Πληροφοριακών & Επικοινωνιακών Συστημάτων

ΤΜΗΜΑ ΜΠΕΣ 23

findMin Algorithm (χωρίς αναδρομή)

// Non-recursive algorithm

BinaryNode* findMin(BinaryNode *t)

begin

// έλεγξε αν το δέντρο είναι άδειο

if (t!=NULL)

begin

// προχώρα κάτω προς το lchild σε κάθε κόμβο

while (t->lchild!=NULL)

t = t->lchild;

end

return t;

end

Page 24: Κώστας Στεργίου Λέκτορας Τμήμα Μηχανικών  Πληροφοριακών & Επικοινωνιακών Συστημάτων

ΤΜΗΜΑ ΜΠΕΣ 24

findMin

Παράδειγμα:

9

7

4

17

14

11

12

21

25

2722

Page 25: Κώστας Στεργίου Λέκτορας Τμήμα Μηχανικών  Πληροφοριακών & Επικοινωνιακών Συστημάτων

ΤΜΗΜΑ ΜΠΕΣ 25

findMax

Σύμφωνα με την BST ιδιότητα, το κλειδί του rchild της ρίζας θα είναι > του κλειδιού της ρίζας

Το κλειδί του rchild του rchild της ρίζας θα είναι > του κλειδιού του rchild της ρίζας κ.ο.κ.

Χρησιμοποιώντας παρόμοια τεχνική όπως στη findMin, το μέγιστο κλειδί σε ένα BST πρέπει να βρίσκεται ξεκινώντας από τη ρίζα και «πηγαίνοντας όλο δεξιά»

Page 26: Κώστας Στεργίου Λέκτορας Τμήμα Μηχανικών  Πληροφοριακών & Επικοινωνιακών Συστημάτων

ΤΜΗΜΑ ΜΠΕΣ 26

findMax

Βήματα αλγορίθμου: Ξεκίνα από τη ρίζα Αν η ρίζα είναι NULL (άδειο BST) επέστρεψε NULL Σε κάθε κόμβο πήγαινε στο rchild Ολοκλήρωσε τη διάσχιση όταν συναντηθεί ο πρώτος NULL

δείκτης Επέστρεψε τον τελευταίο κόμβο που επισκέφτηκες

Η παράμετρος εισόδου στη findMax και ο τύπος που επιστρέφει είναι ίδια με τη findMin

Page 27: Κώστας Στεργίου Λέκτορας Τμήμα Μηχανικών  Πληροφοριακών & Επικοινωνιακών Συστημάτων

ΤΜΗΜΑ ΜΠΕΣ 27

findMax Algorithm (με αναδρομή)

// Recursive algorithm

BinaryNode* findMax(BinaryNode *t){

// check if the tree is empty

if (t==NULL) return NULL;

// if the right child is null

// return the current node

if (t->rchild==NULL) return t;

return findMax (t->rchild);

}

Page 28: Κώστας Στεργίου Λέκτορας Τμήμα Μηχανικών  Πληροφοριακών & Επικοινωνιακών Συστημάτων

ΤΜΗΜΑ ΜΠΕΣ 28

findMax Algorithm (χωρίς αναδρομή)

// Non-recursive algorithm

BinaryNode* findMax(BinaryNode *t)

begin

// έλεγξε αν το δέντρο είναι άδειο

if (t!=NULL)

begin

// προχώρα κάτω προς το rchild σε κάθε κόμβο

while (t->rchild!=NULL)

t = t->rchild;

end

return t;

end

Page 29: Κώστας Στεργίου Λέκτορας Τμήμα Μηχανικών  Πληροφοριακών & Επικοινωνιακών Συστημάτων

ΤΜΗΜΑ ΜΠΕΣ 29

findMax

Παράδειγμα:

9

7

4

17

14

11

12

21

25

2722

Page 30: Κώστας Στεργίου Λέκτορας Τμήμα Μηχανικών  Πληροφοριακών & Επικοινωνιακών Συστημάτων

ΤΜΗΜΑ ΜΠΕΣ 30

find

Ο αλγόριθμος find είναι συνδυασμός των τεχνικών της findMin και της findMax

Η διαφορά μεταξύ του find και των findMin/findMax:

Οι findMin/findMax εγγυώνται ότι θα επιστρέψουν έναν κόμβο όταν το BST δεν είναι άδειο. Από την άλλη, ο αλγόριθμος find επιστρέφει έναν κόμβο μόνο όταν το ζητούμενο κλειδί ‘x’ βρεθεί μέσα στο BST

Page 31: Κώστας Στεργίου Λέκτορας Τμήμα Μηχανικών  Πληροφοριακών & Επικοινωνιακών Συστημάτων

ΤΜΗΜΑ ΜΠΕΣ 31

find

Οι παράμετροι εισόδου είναι η ρίζα του BST και το κλειδί προς αναζήτηση: int x find(x, root);

Η μέθοδος find επιστρέφει τον κόμβο στο BST που περιέχει το κλειδί ‘x’ αν υπάρχει, και NULL αν δεν υπάρχει

Ο τύπος που επιστρέφει είναι πάλι BinaryNode*

Page 32: Κώστας Στεργίου Λέκτορας Τμήμα Μηχανικών  Πληροφοριακών & Επικοινωνιακών Συστημάτων

ΤΜΗΜΑ ΜΠΕΣ 32

find Algorithm

Βήματα αλγορίθμου:1) Start at root; current_node = root

2) if current_node is NULL return NULL

3) if (x < current_node -> key)current_node = current_node -> lchild

4) if (x > current_node -> key)current_node = current_node -> rchild

Repeat steps 2-4 until x = = current_node->key or current_node = = NULL

Page 33: Κώστας Στεργίου Λέκτορας Τμήμα Μηχανικών  Πληροφοριακών & Επικοινωνιακών Συστημάτων

ΤΜΗΜΑ ΜΠΕΣ 33

find Algorithm

// Non-recursive algorithmBinaryNode* findMax(BinaryNode *t, key x) begin // έλεγξε αν το δέντρο είναι άδειο if (t!=NULL)

begin while (t!=NULL && x!=t->key) begin

if (x < t -> key)t = t->lchild;

else if (x > t -> key)t = t->rchild;

endend

return t;end

Page 34: Κώστας Στεργίου Λέκτορας Τμήμα Μηχανικών  Πληροφοριακών & Επικοινωνιακών Συστημάτων

ΤΜΗΜΑ ΜΠΕΣ 34

find Algorithm (με αναδρομή)

// ‘t’ denotes the current nodeBinaryNode* find(int x, BinaryNode *t){ // check if current node is NULL if (t==NULL) return NULL; else if (x < t->key) // search along left subtree return find(x, t->lchild); else if (x > t->key) // search along right subtree return find(x, t->rchild); else

// if we reach here it means // x == t->key. x is found // Return the node containing x return t;

Page 35: Κώστας Στεργίου Λέκτορας Τμήμα Μηχανικών  Πληροφοριακών & Επικοινωνιακών Συστημάτων

ΤΜΗΜΑ ΜΠΕΣ 35

find

Παράδειγμα: Εύρεση του κλειδιού ‘12’ Εύρεση του κλειδιού ‘23’

9

7

4

17

14

11

12

21

25

2722

Page 36: Κώστας Στεργίου Λέκτορας Τμήμα Μηχανικών  Πληροφοριακών & Επικοινωνιακών Συστημάτων

ΤΜΗΜΑ ΜΠΕΣ 36

Insert

Εισαγωγή του κλειδιού ‘5’

9

7

4

17

14

11

12

21

25

2722

9

7

4

17

14

11

12

21

25

2722

5

Page 37: Κώστας Στεργίου Λέκτορας Τμήμα Μηχανικών  Πληροφοριακών & Επικοινωνιακών Συστημάτων

ΤΜΗΜΑ ΜΠΕΣ 37

Insert – Παράδειγμα (εισαγωγή του 5)

Ξεκινάμε από τη ρίζα που περιέχει το κλειδί 9 5 < 9, πηγαίνουμε στο lchild του 9 που είναι το 7 5 < 7, πηγαίνουμε στο lchild του 7 που είναι το 4 5 > 4, πηγαίνουμε στο rchild του 4 που είναι το NULL Δεν υπάρχει άλλο σημείο στο BST που μπορεί να περιέχει το 5

λόγω της BST ιδιότητας Οπότε, εισάγουμε το 5 ως το rchild του 4.

Page 38: Κώστας Στεργίου Λέκτορας Τμήμα Μηχανικών  Πληροφοριακών & Επικοινωνιακών Συστημάτων

ΤΜΗΜΑ ΜΠΕΣ 38

Insert

Κανόνας: Διπλά κλειδιά δεν επιτρέπονται σε ένα BST Αν θέλουμε να εισάγουμε το κλειδί ‘x’, πρώτα κάνουμε ένα

find(x) Αν το ‘x’ βρεθεί, δεν κάνουμε την εισαγωγή Αν το ‘x’ δε βρεθεί, προχωράμε με την εισαγωγή

Αν το ‘x’ δε βρεθεί, τότε η find τελειώνει στον κόμβο κάτω από τον οποίο πρέπει να μπει το ‘x’

Page 39: Κώστας Στεργίου Λέκτορας Τμήμα Μηχανικών  Πληροφοριακών & Επικοινωνιακών Συστημάτων

ΤΜΗΜΑ ΜΠΕΣ 39

Insert

insert (5, root) Πρώτα προσπαθούμε να βρούμε αν το 5 είναι ήδη στο BST find algorithm

5 < 9 πηγαίνουμε στο lchild του 9 που είναι το 7 5 < 7 πηγαίνουμε στο lchild του 7 που είναι το 4 5 > 4 πηγαίνουμε στο rchild του 4 που είναι null και η find τερματίζει

επιστρέφοντας NULL Ο τελευταίος κόμβος που επισκεφτήκαμε ήταν ο 4 Το καινούργιο κλειδί 5 πρέπει να εισαχθεί κάτω από τον 4 Δημιουργούμε έναν καινούργιο κόμβο με κλειδί 5 και μια 5 > 4

προσθέτουμε τον καινούργιο κόμβο ως rchild του 4

Page 40: Κώστας Στεργίου Λέκτορας Τμήμα Μηχανικών  Πληροφοριακών & Επικοινωνιακών Συστημάτων

ΤΜΗΜΑ ΜΠΕΣ 40

Insert

Βήματα Αλγορίθμου: Τρέξε ένα find για το κλειδί που θέλουμε να εισαχθεί Αν το κλειδί βρεθεί, επέστρεψε NULL. Αν το κλειδί δε βρεθεί, εισήγαγε έναν καινούργιο κόμβο που

περιέχει το κλειδί ως αριστερό ή δεξιό παιδί του τελευταίου κόμβου που επισκέφτηκε η find

Παράδειγμα: Εισαγωγή των κλειδιών 6, 9, 14, 17, 5, 7, 16, 20, 18, 19, 4, 11 σε ένα κενό αρχικά δέντρο αναζήτησης

Page 41: Κώστας Στεργίου Λέκτορας Τμήμα Μηχανικών  Πληροφοριακών & Επικοινωνιακών Συστημάτων

ΤΜΗΜΑ ΜΠΕΣ 41

insert Algorithm (με αναδρομή)

// Recursive Algorithm

// ‘t’ is the current node

void insert(int x, BinaryNode *t){

// if the current node is NULL// we have not found the key

// in the BST and reached a NULL

// pointer. So, we insert a new node

// containing ‘x’ at the current_node.

if (t == NULL) {

t = new BinaryNode(x, NULL, NULL);

return;}

Page 42: Κώστας Στεργίου Λέκτορας Τμήμα Μηχανικών  Πληροφοριακών & Επικοινωνιακών Συστημάτων

ΤΜΗΜΑ ΜΠΕΣ 42

insert Algorithm (με αναδρομή)

// in this portion we are doing the

// steps for the find algorithm

else if (x < t->key)

return insert(x, t->lchild);

else if (x > t->key)

return insert(x, t->rchild);

else return NULL; // the code reaches here if

// x == t-> key.

}

Page 43: Κώστας Στεργίου Λέκτορας Τμήμα Μηχανικών  Πληροφοριακών & Επικοινωνιακών Συστημάτων

ΤΜΗΜΑ ΜΠΕΣ 43

remove

Όπως στην περίπτωση του insert, πρέπει πρώτα να κάνουμε ένα find

Αν δε βρεθεί ο κόμβος, προφανώς δε μπορούμε να τον διαγράψουμε

Αν βρεθεί υπάρχουν 3 διαφορετικές περιπτώσεις ανάλογα με το είδος του κόμβου:

κόμβοι χωρίς παιδιά (φύλλα), κόμβοι με ένα παιδί κόμβοι με δύο παιδιά

Page 44: Κώστας Στεργίου Λέκτορας Τμήμα Μηχανικών  Πληροφοριακών & Επικοινωνιακών Συστημάτων

ΤΜΗΜΑ ΜΠΕΣ 44

remove - Κανόνες

Κανόνες: 1) Αν ο κόμβος που

θέλουμε να διαγράψουμε είναι φύλλο, τότε διαγράφεται κατευθείαν

27

Μπορεί να διαγραφεί κατευθείαν

9

7

4

17

14

11

12

21

25

2722

Page 45: Κώστας Στεργίου Λέκτορας Τμήμα Μηχανικών  Πληροφοριακών & Επικοινωνιακών Συστημάτων

ΤΜΗΜΑ ΜΠΕΣ 45

remove - Κανόνες

2) Αν ο κόμβος που θέλουμε να διαγράψουμε έχει ένα παιδί, το παιδί αυτό γίνεται το καινούργιο παιδί του πατέρα του διαγραμμένου κόμβου

25

27

21 διέγραψε το 25

27

21

Page 46: Κώστας Στεργίου Λέκτορας Τμήμα Μηχανικών  Πληροφοριακών & Επικοινωνιακών Συστημάτων

ΤΜΗΜΑ ΜΠΕΣ 46

remove - Κανόνες

3) Αν ο κόμβος που θέλουμε να διαγράψουμε έχει δύο παιδιά• Αντικατέστησε τον κόμβο προς διαγραφή με τον κόμβο που

περιέχει το ελάχιστο κλειδί στο δεξιό του υποδέντρο (χρησιμοποιώντας τη findMin στη ρίζα του δεξιού υποδέντρου του κόμβου προς διαγραφή) Ο κόμβος με το ελάχιστο κλειδί δε μπορεί να έχει lchild. Αν είχε

τότε το lchild θα περιείχε το ελάχιστο κλεδί Οπότε ο κόμβος με το ελάχιστο κλειδί έχει μόνο rchild ή καθόλου

παιδιά

Page 47: Κώστας Στεργίου Λέκτορας Τμήμα Μηχανικών  Πληροφοριακών & Επικοινωνιακών Συστημάτων

ΤΜΗΜΑ ΜΠΕΣ 47

remove - Κανόνες

6

2

1

8

5

3

4

διέγραψε το 2

Το ‘2’ έχει 2 παιδιά.findMin στη ρίζα του δεξιού υποδέντρου του ‘2’ δίνει ‘3’ που έχει ένα rchild

6

3

1

8

5

3

4

Αντικατέστησε το ‘2’με το ‘3’

Αυτός ο κόμβοςκαι οι σχετιζόμενοιδείκτες διαγράφονται