Δοµές Δεδοµένων & Ανάλυση Αλγορίθµων 3ο Εξάµηνο Δέντρα Δυαδικά Δέντρα Δυαδικά Δέντρα Αναζήτησης (inary Search Trees) http://aetos.it.teithe.gr/~demos/teaching_r.html Δηµοσθένης Σταµάτης Τµήµα Πληροφορικής TI ΘΕΣΣΑΛΟΝΙΚΗΣ ΔΕΝΤΡΑ (TRS) H I J K L M 1
ΔΕΝΤΡΑ (TRS) Oρισμός 1: Δέντρο (tree) είναι ένα σύνολο T από κόμβους (nodes), τέτοιο ώστε είτε: (α)tο Tείναι κενό ή (β) Tο T περιλαμβάνει ένα ξεχωριστό κόμβο, R, που ονομάζεται ρίζα (root) του Tκαι οι υπόλοιποι κόμβοι T -{Rχωρίζονται σε μηδέν ή περισσότερα σύνολα κόμβων, T1, T2,..., Tn, που είναι ξένα μεταξύ τους και τα οποία είναι με τη σειρά τους δέντρα. TαT1, T2,..., Tn, ονομάζονται υποδέντρα του T. Oρισμός 2: Δέντροείναι μία συλλογή από στοιχεία, που ονομάζονται κόμβοι. Oι κόμβοι του δέντρου συνδέονται μεταξύ τους με τη βοήθεια ακμών (arcs) με βάση τους εξής κανόνες: (α)yπάρχει ένας και μόνον ένας κόμβος στον οποίο δεν καταλήγει καμία ακμή (η Pίζα {Rootτου δέντρου). (β)σε όλους τους υπόλοιπους κόμβους καταλήγει υποχρεωτικά μία και μόνο μία ακμή. ΔΕΝΤΡΑ (TRS) H I J K L M T = {,,,,,,, H, I, J, K, L, M :η ρίζα του του έντρου Το σύνολο T - { χωρίζεται σε τρία υποδέντρα: T1 = {,,,, T2 = {, H, I και T3 = {, J, K, L, M 2
ΔΥΑΔΙΚΑ ΔΕΝΤΡΑ (INRY TRS) ΟΡΙΣΜΟΣ 3: Δυαδικό δέντρο (binarytree)είναι ένα δέντρο του οποίου κάθε κόμβος έχει το πολύ δύο υποδέντρα. Tα υποδέντρα του δυαδικού δέντρου ονομάζονται αριστερό και δεξιό υποδέντρο αντίστοιχα. Αναπαράσταση Δυαδικού Δέντρου με τη βοήθεια συνδεδεμένης δομής Root Root.left Root.right null null null null null null null null 3
Αναπαράσταση Δυαδικού Δέντρου με τη βοήθεια συνδεδεμένης δομής class TreeNode { TreeNode left; int item; TreeNode right; public TreeNode(int data) { item = data; left = right = null;.. // class TreeNode συνέχεια public void insert(int d) { if (d < item) { if (left == null) left = new TreeNode(d); left.insert(d); if (right == null) right = new TreeNode(d); right.insert(d); 4
νθεματική Διέλευση (Inorder Traversal ) από τους κόμβους ενός Δυαδικού Δέντρου private void inorder(treenode node) inorder(node.left); inorder(node.right); Προθεματική Διέλευση (Preorder Traversal ) από τους κόμβους ενός Δυαδικού Δέντρου private void preorder(treenode node) preorder(node.left); preorder(node.right); 5
Επιθεματική Διέλευση (Postorder Traversal ) από τους κόμβους ενός Δυαδικού Δέντρου private void postorder(treenode node) postorder(node.left); postorder(node.right); public class STree { TreeNode root; Δυαδικό Δέντρο Αναζήτησης public STree( ) { root = null; public void insertnode(int d) { if (root == null) root = new TreeNode(d); root.insert(d); 6
Δυαδικό Δέντρο Αναζήτησης // public class STree (συνέχεια) public void inordertraversal( ) { inorder(root); private void inorder(treenode node) inorder(node.left); inorder(node.right); 7