Συγκρίσιμα Αντικείμενα (comparable) public class Student implements Comparable{ public String lastname; public String firstname; public int am; public int compareto(object s) throws ClassCastException{ if (!(s instanceof Student)) throw new ClassCastException("A Student object expected."); if (this.am<((student) s).am) return -1; else if (this.am>((student) s).am) return 1; else return 0; Student s1=new Student("Liaka","Kaiti",230450); Student s2=new Student("Manou","Mary", 230456); if (s1.compareto(s2) <0 ) System.out.println("1st has smaller AM"); else if (s1.compareto(s2) >0) System.out.println("1st has bigger AM"); else System.out.println("with same AM"); // == 0 VK 54
Binary Search Tree :Αλλαγή του item από intσε Οbject Yλοποίηση Κόμβου public class TreeNode { private TreeNode left; private Οbject item ;//πριν ήταν int privatetreenode right; //. Yλοποίηση Δένδρου public class ΒSTree { private TreeNode root; // class TreeNode Θα αλλαχθούν οι µέθοδοι δοµητές setitem(object item) Object getitem() class BSTree Θα αλλαχθούν οι µέθοδοι που απαιτούν σύγκριση δεδοµένων. Στην εισαγωγή νέου κόµβου σε ένα BST συγκρίνουµε τα δεδοµένα data του νέου κόµβου µε τo item του κόµβου node. Η µέθοδος : insertelement(comparable data) καλεί την insert µε κόµβο τον root: insert(data, root) για να συγκρίνει το dataµε το item του κόµβου για να αποφασίσει αν θα το βάλει στα αριστερά ή στα δεξιά του. insert (Comparable data, TreeNode node) { if (data.compareto (node.getitem()) <0 // VK 55
Υψος κόμβου και δένδρου(binarysearchtree) Το ύψος του δένδρου είναιτο ύψος του root Η και είναι η απόστασή του από το µακρινότερο παιδί του (είναι το/τα D,N) δηλ.3. Το ύψος του κόµβου Rείναι 2 Το ύψος του κόµβου Cείναι 1 Tα ύψη των φύλλων είναι 0 Υψοςενόςκόμβου Είναι η απόστασή του από το μακρινότερο παιδί του. Αναδρομικός υπολογισμός: Το μέγιστο από τα ύψη των παιδιών του προσαυξημένο κατά 1. Υψος ενός δένδρου Είναιτούψοςτηςρίζαςτου. VK 56
1 Κόμβοι & Υψος ΔένδρουBST 0 Μαx Αρ.Κόµβων ανά επίπεδο επ.0 1 = 2 0 επ.1 2 = 2 1 επ.2 4 = 2 2 επ.3 8 =2 3.. επ. i 2 i Σύνολο Κόµβων 2 = 2 h+1-1 Αραοµέγιστος 3 αριθµός κόµβωνενός δυαδικού δένδρου µε ύψος h είναι 2 h+1-1 2 3+1-1 =15 Αναδροµικός υπολογισµός αριθµού κόµβων δένδρου: Ο αριθµός κόµβων του δένδρου, είναι ίσος µε το άθροισµα των κόµβων του αριστερού κλάδου και του δεξιού κλάδου, συν 1. VK 57
BST: πλήθος κόμβων, ύψος αναδρομικές μέθοδοι: 1. Υπολογίζει και επιστρέφειτο πλήθοςτων κόμβων του δένδρου private int size(treenodenode) if (node==null) πλήθος 0 πλήθος του αριστερού κλαδιού + πλήθος του δεξιού κλαδιού +1 2. Υπολογίζει και επιστρέφει το ύψοςτου δένδρου private int height (TreeNodenode) if (node == null) ύψος -1 if (node.isleaf()) ύψος 0 ύψος= 1+mαx(ύψος αριστερού κλαδιού, ύψος δεξιού κλαδιού) // Math.max(a1,a2) για int,float,double 3. Υπολογίζει και επιστρέφει το ύψος του κόμβου με δεδομένα data private int height (Comparable data) Ανάγεται => 3a. Kαλεί την height(όπως στο 2.) αφού πρώτα 3b. ψάξει το data και επιστρέψει τον κόμβο node που το έχει (με συγκρίσεις) private TreeNodesearch(Comparabledata,TreeNodenode) Συγκρίνει data και node.item αν είναι IΣΑ επιστρέφεται το node αν υπάρχει κόμβος αριστερά θα ψάξει αριστερά αν δεν το βρήκε αριστερά, και υπάρχει κόμβος δεξιά θα ψάξει δεξιά VK 58
ΒST problems boolean lookup(οbject target)//search Eλέγχει αν υπάρχει σε κάποιο κόμβο«η τιμή» target. int size(treenode node) Μετρά τον αριθμό των κόμβων. int maxdepth(treenode node)//ύψος δένδρου Μετρά τον αριθμό των κόμβων στο μακρύτερο κλαδί maxdepth=3 int minvalue() //και αντίστοιχα maxvalue() Βρίσκει την μικρότερη τιμή από όλους τους κόμβους, που βρίσκεται κάτω αριστερά. boolean haspathsum(treenode node, int sum) Eλέγχειαν υπάρχει μονοπάτι που το άθροισμα των τιμών των κόμβων είναι το sum. (κλήση left/right node με subsum = sum - node.getitem() void printpaths(treenode node) Tυπώνειόλα τα μονοπάτια από την ρίζα προς τα φύλλα (ένα ανά γραμμή). (με πίνακα και δείκτη) void mirror(treenode node) Αλλάζει το δένδρο αντιστρέφοντας αριστερό με δεξιό κόμβο (swap left/right node) VK 59
void doubletree(treenode node) ΒST problems Για κάθε κόμβο δημιουργείται νέος κόμβος με ίδια τιμή και μπαίνει ως αριστερό του παιδί (node.setleft(new TreeNode(node.getItem())) boolean sametree(treenode node, TreeNode node1) Eλέγχει αν δυο δένδρα είναι ίδια (ξεκινά συγκρίνοντας τις 2 ρίζες..) static int counttrees(int nb) Μετρά το πλήθοςτων διαφορετικών BSTδένδρων με nb κόμβους, π.χ.με nb=3 κόμβους φτιάχνω 5 BST. Για κάθε κόμβο μετρά δεξιά επί αριστερά δένδρα(sum += left*right)!!! boolean isbst(τreenode Node) Eλέγχει αν ένα δένδρο είναι BST / δυαδικό δένδρο αναζήτησης (συγκρίνεις με MaxValue αριστερού κόμβου και αντίστοιχα με MinValue δεξιού κόμβου ) http://cslibrary.stanford.edu/110/binarytrees.html#java //(με int item) int oddsize(treenode node) //και αντίστοιχα evensize() Μετρά το πλήθος των κόμβων, με item περιττό αριθμό (node.getitem()%2)!=0) int rightnodecount(treenode node)//και αντίστοιχα leftnodecount Μετρά το πλήθος των κόμβων, που είναι δεξιά παιδιά στο δέντρο. int BF_zero(TreeNode node) Μετρά το πλήθος των κόμβων με balance factor0( bf=ύψος δεξιού -ύψος αριστερού υπόδενδρου) VK 60