typ Java Generic binarne drzewo poszukiwań problem

głosy
1

Pracuję w tej pracy domowej, która jest swego rodzaju mylące mnie ...

Ja wyposażony następującej klasie BinarySearchTree

import java.util.NoSuchElementException;

/**
 *
 * @param <T> The type of data stored in the nodes of the tree, must implement  Comparable<T> with the compareTo method.
 */
public class BinarySearchTree<T extends Comparable<T>> {


    BinaryTree<T> tree;

    int size;
    public BinarySearchTree() {
        tree = new BinaryTree<T>();
        size = 0;
    }

    public boolean isEmpty() {
        return tree.isEmpty();
    }

    protected BinaryTree<T> recursiveSearch(BinaryTree<T> root, T key) {
        if (root == null) {
            return null;
        }
        int c = key.compareTo(root.data);
        if (c == 0) {
            return root;
        }
        if (c < 0) {
            return recursiveSearch(root.left, key);
        } else {
            return recursiveSearch(root.right, key);
        }
    }

    public T search(T key) {
        if (tree.isEmpty()) { 
            return null;
        }
        return recursiveSearch(tree, key).data;
    }

    public void insert(T item) {

        if (tree.isEmpty()) { // insert here
            tree.makeRoot(item);
            size++;
            return;
        }

        // do an iterative descent
        BinaryTree<T> root = tree;
        boolean done=false;
        BinaryTree<T> newNode = null;
        while (!done) {
            int c = item.compareTo(root.data);
            if (c == 0) { // duplicate found, cannot be inserted
                throw new OrderViolationException();
            }
            if (c < 0) { // insert in left subtree
                if (root.left == null) { // insert here as left child
                    newNode = new BinaryTree<T>();
                    root.left = newNode;
                    done=true;
                } else { // go further down left subtree
                    root = root.left;
                }
            } else { // insert in right subtree
                if (root.right == null) { // insert here as right child 
                    newNode = new BinaryTree<T>();
                    root.right = newNode;
                    done=true;
                } else { // go further down right subtree
                    root = root.right;
                }
            }
        }
        // set fields of new node
        newNode.data = item;
        newNode.parent = root;
        size++;
    }

    /**
     * @param deleteNode Node whose parent will receive new node as right or left child,
     *                  depending on whether this node is its parent's right or left child. 
     * @param attach The node to be attached to parent of deleteNode.
     */
    protected void deleteHere(BinaryTree<T> deleteNode, BinaryTree<T> attach) {

        // deleteNode has only one subtree, attach
        BinaryTree<T> parent = deleteNode.parent;
        deleteNode.clear();  // clear the fields
        if (parent == null) {
            return;
        }
        if (deleteNode == parent.left) {
            // left child of parent, attach as left subtree
            parent.detachLeft();
            parent.attachLeft(attach);
            return;
        }
        // attach as right subtree
        parent.detachRight();
        parent.attachRight(attach);
    }


    protected BinaryTree<T> findPredecessor(BinaryTree<T> node) {
        if (node.left == null) {
            return null;
        }
        BinaryTree<T> pred = node.left; // turn left once
        while (pred.right != null) { // keep turning right
            pred = pred.right;
        }
        return pred;
    }


    public T delete(T key) {
        if (tree.isEmpty()) { // can't delete from an empty tree
            throw new NoSuchElementException();
        }

        // find node containing key 
        BinaryTree<T> deleteNode = recursiveSearch(tree, key);
        if (deleteNode == null) { // data not found, can't delete
            throw new NoSuchElementException();
        }

        BinaryTree<T> hold;

        // case c: deleteNode has exactly two subtrees
        if (deleteNode.right != null && deleteNode.left != null) {
            hold = findPredecessor(deleteNode);
            deleteNode.data = hold.data;
            deleteNode = hold; // fall through to case a or b
        }

        // case a: deleteNode is a leaf
        if (deleteNode.left == null && deleteNode.right == null) {
            deleteHere(deleteNode, null);
            size--;
            return deleteNode.data;
        }       

        // case b: deleteNode has exactly one subtree
        if (deleteNode.right != null) {
            hold = deleteNode.right;
            deleteNode.right = null;
        } else {
            hold = deleteNode.left;
            deleteNode.left = null;
        }

        deleteHere(deleteNode,hold);
        if (tree == deleteNode) { // root deleted
            tree = hold;
        }
        size--;
        return deleteNode.data;
    }


    public T minKey() {
        if (tree.data == null) { // tree empty, can't find min value
            throw new NoSuchElementException();
        }

        BinaryTree<T> root = tree;
        T min=root.data;
        root = root.left;  // turn left once
        while (root != null) {  // keep going left to leftmost node
            min = root.data;
            root = root.left;
        }
        return min;
    }


    public T maxKey() {
        if (tree.getData() == null) { // tree empty, can't find max value
            throw new NoSuchElementException();
        }

        BinaryTree<T> root=tree;
        T max=root.data;
        root = root.right;  // turn right once
        while (root != null) { // keep going to rightmost node
            max = root.data;
            root = root.right;
        }
        return max;
    }


    public int size() {
        return size;
    }


    protected void recursivePreOrder(BinaryTree<T> root, Visitor<T> visitor) {
        if (root != null) {
            visitor.visit(root);
            recursivePreOrder(root.left, visitor);
            recursivePreOrder(root.right, visitor);
        }
    }


    public void preOrder(Visitor<T> visitor) {
        if (tree.isEmpty()) {
            return;
        }
        recursivePreOrder(tree, visitor);
    }


    protected void recursiveInOrder(BinaryTree<T> root, Visitor<T> visitor) {
        if (root != null) {
            recursiveInOrder(root.left, visitor);
            visitor.visit(root);
            recursiveInOrder(root.right, visitor);
        }
    }


    public void inOrder(Visitor<T> visitor) {
        if (tree.isEmpty()) {   
            return;
        }
        recursiveInOrder(tree, visitor);
    }


    protected void recursivePostOrder(BinaryTree<T> root, Visitor<T> visitor) {
        if (root != null) {
            recursivePostOrder(root.left, visitor);
            recursivePostOrder(root.right, visitor);
            visitor.visit(root);
        }
    }

    public void postOrder(Visitor<T> visitor) {
        if (tree.isEmpty()) {
            return;
        }
        recursivePostOrder(tree, visitor);
    }
}

================================================== ==============================

Teraz mam innej klasy Student .... Chcę utworzyć przeszukiwania binarnego drzewa obiektów studenckich ..

BinarySearchTree<Student> tree = new BinarySearchTree<Student>();

Jednak gdy to zrobić pojawia się następujący błąd:

Związany Niedopasowanie: typ Student nie jest prawidłową substytut dla parametru ograniczonego> od typu BinarySearchTree

Wszelkie pomysły, co tu się dzieje ... Nie mogę zrozumieć.

Utwórz 02/05/2009 o 06:31
źródło użytkownik
W innych językach...                            


3 odpowiedzi

głosy
0

Czy uczeń klasy wdrożyć porównywalne?

Odpowiedział 02/05/2009 o 06:41
źródło użytkownik

głosy
0

ale nie jestem pewien, jak zaimplementować metodę compareTo.

Zasadniczo jest to coś jak poniżej. Jak działa zamawianie musisz zdecydować.

class Student implements Comparable<Student> {

    //...

    int compareTo(Student other) {
        // return some negative number if this object is less than other
        // return 0 if this object is equal to other
        // return some positive number if this object is greater than other
    }
}
Odpowiedział 02/05/2009 o 06:56
źródło użytkownik

głosy
6

 public class BinarySearchTree<T extends Comparable<T>> 

Formalne rodzajowych argument w sprawie T, wymienia, co jest wymagane dla klasy za ważny T. w was sprawy, powiedziałeś, „aby być poprawnym T, klasa musi implementować Porównywalne” (Słowo kluczowe to „rozszerza ”, ale w praktyce oznacza«obejmuje lub narzędzia»).

W swojej instancji, T Studenta. Jeżeli podstawimy Studenta dla T:

public class BinarySearchTree<Student extends Comparable<Student>>

jest to, że prawdziwym stwierdzeniem? Student ma realizować naprawdę porównywalne?

Jeśli tak, student wpisuje wymogu bycia T, a więc można go używać jako Student rzeczywistego parametru dla parametru formalnego T.

Jeśli nie, masz zażalenie kompilator widziałeś.

Faktycznie, w celu pokrycia bardziej skomplikowane sytuacje, w których realizacja podklasy w porównywalnych jest wykonywana przez super klasy, tym bardziej powszechną formą byłoby:

   public class BinarySearchTree<T extends Comparable<? super T > > 

Więc trzeba zrobić Student wdrożyć Porównywalne <Student>.

Zauważ, że nie powiedzieć, że kompilator szuka dla Student.compareTo. To nawet nie tak daleko. To spojrzenie, aby zobaczyć czy T (w przypadku studentów) jest zadeklarowana jako wykonawczych Porównywalne <T> (w przypadku Porównywalne <Student>).

Teraz dodając implements Comparable< Student >do Student będzie również uczynić kompilator upewnić się, że istnieje public int compareTosposób na Studenta. Ale bez „realizuje Porównywalne”, nawet jeśli kompilator wie, że jest to metoda Student.compareTo, to nie wie, że compareTojest Comparable.compareTo.

(Innymi słowy, szukamy realizacji deklarowanych, nie tylko, że nie dzieje się to metoda z prawej nazwisko i podpis).

Odpowiedział 02/05/2009 o 06:57
źródło użytkownik

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more