ΔυαδικάΔΕΝΔΡΑΑναζήτησης Ρίζα (κόμβος που δεν έχει γονέα) πρόγονοι απόγονοι γονέας παιδιά έντρο είναι µία συλλογή από στοιχεία, που ονοµάζονται κόµβοι και συνδέονται µεταξύ τους µε τη βοήθεια ακµών αδέλφια κόμβοι με κοινό πατέρα Φύλλα (κόμβοι χωρίς παιδιά) Δυαδικό δένδρο Κάθε κόμβος έχει το πολύ 2 παιδιά, Το αριστερό και το δεξί. Μπορεί να έχει και ένα μόνο παιδί. (Σε ένα γνήσιο δυαδικό δένδρο, κάθε κόμβος έχει ή 0 ή 2 παιδιά) VK 46
Αριθμητικές Παραστάσεις σε δυαδικό δένδρο VK 47
Trees (Traversing) ΙΑΠΕΡΑΣΗ ΕΝ ΡΟΥ Συστηµατικός τρόπος επίσκεψης όλων των κόµβων του δένδρου. Υπάρχουν 4 τρόποι διαπέρασης: ενδοδιατεταγμένη- InOrder 1, 3, 5, 6, 8, 9, προδιατεταγµένη - PreOrder 5, 1, 3, 8, 6, 9, µεταδιατεταγµένη - PostOrder 3, 1, 6, 9, 8, 5, διάταξη κατά επίπεδα υαδικά ένδρα Αναζήτησης Κάθεκόµβος είναι µεγαλύτερος των κόµβων του αριστερού του κλάδου και µικρότερος των κόµβων του δεξιού του κλάδου (6<8<9) Όταν διαπεραστούν (traversing) µε ενδοδιάταξη (αριστερό, πατέρας, δεξί) ορίζεται µόνο στα δυαδικά δένδρα - εµφανίζονται τα στοιχεία ταξινοµηµένα. VK 48
Αναπαράσταση Δυαδικού Δένδρου με την βοήθεια διπλά συνδεδεμένης λίστας public class BSTree { private TreeNode root; public BSTree() {root=null; Υλοποίηση Κόμβου public boolean isleaf() public class TreeNode { private TreeNode left; private int item; private TreeNode right; public TreeNode(TreeNode l, int i,treenode r) {left=l; item=i; right=r; public TreeNode() {this(nulll,null,null); //μέθοδοι get/set VK 49
Trees (adding) insert (5,root) insert(1,root) insert(8,root) insert(3,root) (3 < 5) (root.left == null) insert (3,node1) insert(3,node1) (3 > 1) tree.add (5) tree.add (1) tree.add (8) tree.add (6) tree.add (3) tree.add (9) (root.right = = null) node1.left =new node(3) αν το 3 είναι µικρότερο από το «5» αν αριστερά του «5» δεν υπάρχει κάτι βάλτο αριστερά του αλλιώς insert (3, στον αριστερό του «5») void insert (item,node) Αν (item < node.item) Αλλιως Αν (node.left==null) αλλιώς node.left=new node(item) insert( item, node.left) αν (item > node.item) (node.right==null) node.right=new node(item) insert( item,node.right) αν το 3 είναι µεγαλύτερο από το «1» αν δεξιά του «1» δεν υπάρχει κάτι βάλτο δεξιά του αλλιώς insert (3, στον δεξιά του «1») VK 50
tree.remove (9) delete(9,root) Trees Removing (a. -leaf) Aν βγει φύλλο,που ΕΝ ΕΧΕΙ ΠΑΙ ΙΑ TreeNode delete(item,node) if (node == null) return node if (item==node.item) //είναι στον κόµβο if (node.isleaf) return null { //επόµενη διαφάνεια delete (9,root) (root==null) (9 == 5) (9 > 5) root.setright ( delete(9,node8)) return root delete (9,node8) delete (9,node9) (node8==null) (node9.isleaf) (9==8) return null (9 > 8) node8.setright ( delete (9,node9) ) return node8 { //δεν είναι στο κόµβο if (item < node.item) //ψάξε left node.setleft (delete(item, node.left) return node if (item > node.item) //ψάξε right node.setright(delete(item, node.right) return node VK 51
Trees Removing (b. internal -right null) tree.remove (8) =>delete(8,root) delete (8,node8) delete (8,root) (node8==null) (root==null) (8==8) (8 == 5) (node8.isleaf) (8 > 5) (node8.right==null) root.setright node8.setitem(6) ( delete(8,node8)) node8.setleft(null) return root node8.setright(null) return node8 TreeNode delete(item,node) if (node == null) return node if(item==node.item) //είναι στον κόµβο { (node.isleaf) return null { if (node.right==null) node.setitem(node.left(item)) node.setleft((node.left).left) node.setright((node.left).right) {.. //επόµενη διαφάνεια return node //δεν είναι στο κόµβο { if(item < node.item) //L node.setleft (delete(item, node.left) return node if (item > node.item) //R node.setright(delete(item, node.right) return node VK 52
2 Trees Removing (c. internal right not null) tree.remove (1) =>delete(1,root) delete (1,node1) (node1==null) (1==1) delete (1,root) (node1.isleaf) (root==null) (node1.right==null) (1 == 5) node1.setitem(3) (1 < 5) (node1.left==null) root.setleft node1.setleft(3.left) ( delete(1,node1)) node1.setright(3.right) return root return node1 TreeNode delete(item,node) if (node == null) return node if (item==node.item) //είναι στον κόµβο { if (node.isleaf) return null { if (node.right==null). { //leaf with left null node.setitem(node.left(item)) if (node.left==null) node.setleft((node.right).left) { Rnode=node.left while (Rnode.right!=null) {Rnode=Rnode.right Rnode.setRight ((node.right).left) node.setright((node.right).right) return node //δεν είναι στο κόµβο {. VK 53