Java Generisches binärer Suchbaum Typ Ausgabe

stimmen
1

Ich arbeite an diesem Hausaufgaben, die mich Art von verwirrend ...

Ich bin mit der folgenden BinarySearchTree-Klasse

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);
    }
}

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

Jetzt habe ich eine andere Klasse Schüler .... Ich will einen binären Suchbaum von Studenten Objekte erstellen ..

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

Allerdings, wenn ich tun, dass ich die folgende Fehlermeldung erhalten:

Gebunden Mismatch: Der Typ: Student ist kein gültiger Ersatz für den beschränkten Parameter> des Typs BinarySearchTree

Irgendwelche Ideen, was hier los ist ... Ich kann es nicht herausfinden.

Veröffentlicht am 02/05/2009 um 06:31
quelle vom benutzer
In anderen Sprachen...                            


3 antworten

stimmen
0

Hat der Klasse Schüler implementieren Vergleichbar?

Beantwortet am 02/05/2009 um 06:41
quelle vom benutzer

stimmen
0

aber ich bin nicht ganz sicher, wie die Methode compareTo zu implementieren.

Im Grunde ist es so etwas wie die folgenden. Wie die Bestellung funktioniert müssen Sie entscheiden.

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
    }
}
Beantwortet am 02/05/2009 um 06:56
quelle vom benutzer

stimmen
6

 public class BinarySearchTree<T extends Comparable<T>> 

Ein formales Argument Generika, in Ihrem Fall T listet, was erforderlich ist für eine Klasse einen gültigen T. In Ihrem Fall zu sein, Sie haben gesagt, „ein gültiger T, eine Klasse zu sein, muß vergleichbar implementieren“ (Das Schlüsselwort ist „erweitert “, aber in der Praxis bedeutet‚erstreckt oder Geräte‘.)

In Ihrer Instanziierung ist T-Studenten. Wenn wir Studenten für T ersetzen:

public class BinarySearchTree<Student extends Comparable<Student>>

ist, dass eine wahre Aussage? Implementiert Schüler wirklich vergleichbar?

Ist dies der Fall, Schüler passen die Forderung ein T zu sein, und so kann man Schüler als eigentlichen Parameter für den formalen Parameter T. verwenden

Wenn nicht, erhalten Sie die Beschwerde der Compiler Sie sahen.

Tatsächlich zu decken kompliziertere Situationen, in denen eine Unterklasse der Umsetzung vergleichbarer durch eine Super-Klasse durchgeführt wird, die allgemeinerer Form wäre:

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

Sie müssen also Schüler Vergleichbar <Schüler> machen implementieren.

Beachten Sie, dass ich nicht sagen , dass der Compiler für eine sucht Student.compareTo. Es ist nicht einmal so weit kommen. Es sieht nach , ob T (in Ihrem Fall, Schüler) als Umsetzung Vergleichbare erklärt <T> (in Ihrem Fall, Comparable <Studenten>).

Jetzt Hinzufügen implements Comparable< Student >zum Student wird auch die Compiler machen sicherzustellen , dass ein es gibt public int compareToVerfahren auf Schüler. Aber ohne die „implementiert Comparable“, auch wenn der Compiler weiß , es gibt eine Methode Student.compareTo, es nicht wissen, dass compareTodas ist Comparable.compareTo.

(Mit anderen Worten, wir suchen erklärt Implementierung, nicht nur, dass es passiert, ein Verfahren mit dem richtigen Namen und Unterschrift sein.)

Beantwortet am 02/05/2009 um 06:57
quelle vom benutzer

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