Ändern einer BinarySearchTree ausgeglichen werden (AVL): Java

stimmen
2

Ich brauche einen binären Suchbaum zu ändern, die ich geschaffen, um sicherzustellen, dass es ausgeglichen ist. Ich brauche nur das Hinzufügen und Entfernen von Methoden zu ändern, nach meinen Anweisungen. Hier ist, was ich derzeit haben:

package proj;

public class BinarySearchTree<T extends Comparable<T>>{
    public static void main(String[] args) {
        BinarySearchTree<Integer> tree = new BinarySearchTree<Integer>();
        tree.add(5);
        tree.add(1);
        tree.add(2);
        tree.add(6);
    }

    private Node<T> root;
    private int size;
    String inorder = ;
    String preorder = ;

    public BinarySearchTree(){
        root = null;
        size = 0;
    }

    //adds a new item to the queue
    public void add(T obj) {
        Node<T> n = new Node<T>(obj);
        if( root == null ) {
            root = n;
        } else {
            add( root, n );
        }
        size++;
    }

    private void add(Node<T> subtree, Node<T> n) {
        if( subtree.getValue().compareTo(n.getValue()) > 0 ) {
            if( subtree.getLeftChild() == null ) {
                subtree.setLeftChild(n);
                n.setParent(subtree);
            } else {
                add( subtree.getLeftChild(), n );
            }
        } else {
            if( subtree.getRightChild() == null ) {
                subtree.setRightChild(n);
                n.setParent(subtree);
            } else {
                add( subtree.getRightChild(), n );
            }
        }
    }

    //returns the head of the queue
    public T peek(){
        Node<T> current = root;
        while(current.getLeftChild() != null){
            current = current.getLeftChild();
        }
        return current.getValue();
    }

    //removes the head of the queue and returns it
    public T remove(){
        if(root == null){
            return null;
        }

        Node<T> current = root;
        while(current.getLeftChild() != null){
            current = current.getLeftChild();
        }
        if( current.getParent() == null ) {
            root = current.getRightChild();
            if(root != null){
                root.setParent(null);
            }
        } else {
            current.getParent().setLeftChild(current.getRightChild());
            if(current.getRightChild() != null){
                current.getRightChild().setParent(current.getParent());
            }
        }
        size--;
        return current.getValue();
    }

    //returns the position of an element in the queue, or -1 if it is not found
    public int search(T searchItem){
        String tempOrdered = inorder(root);
        for(int i = 0; i<tempOrdered.length(); i++){
            if(String.valueOf(tempOrdered.charAt(i)).equals(searchItem.toString())){
                return i;
            }
        }
        return -1;
    }

    //returns number of nodes in the tree
    //returns the total number of elements in the queue
    public int getSize(){
        return size;
    }
    public String inorder() {
        inorder = ;
        if( root == null )
            return inorder;
        return inorder(root);
    }

    //returns an in-order, comma-separated string of every element in the queue
    private String inorder(Node<T> n){
        if(n.getLeftChild() != null){
            inorder(n.getLeftChild());
        }
        inorder += n.getValue();
        if(n.getRightChild() != null){
            inorder(n.getRightChild());
        }
        return inorder;
    }

    public String preorder() {
        preorder = ;
        if( root == null )
            return preorder;
        return preorder(root);
    }

    //returns a pre-ordered, comma-separated string of every element in the queue
    private String preorder(Node<T> n){
        preorder+= n.getValue();
        if(n.getLeftChild() != null){
            preorder(n.getLeftChild());
        }
        if(n.getRightChild() != null){
            preorder(n.getRightChild());
        }

        return preorder;
    }

    //returns the height of the tree; returns -1 if the tree is empty
    public int height(Node<T> n){
        if(n == null){
            return -1;
        }
        return Math.max(height(n.getLeftChild()), height(n.getRightChild()))+ 1;
    }

    //returns the root node
    public Node<T> getRoot(){
        return root;
    }
}

Ich bin nicht für jemanden, der mich durch diese Zuordnung zu gehen - einfach für ein paar Ratschläge suchen, wie ich dies zu tun gehen sollte, so dass ich in den Code auf halbem Weg nicht brechen Ich vermute, dass ich brauche. etwas in der Art von Überprüfung der Ausgleichsfaktor des Baumes jedes Mal, wenn etwas hinzugefügt oder entfernt wird, dann rekonstruieren, den Baum oder ‚drehen‘ zu tun, wenn es nicht im Gleichgewicht ist.

Vielen Dank für jede gegebene Beratung im Voraus. :) Genießen Sie die Tipps alle.

-Chris

Veröffentlicht am 02/06/2011 um 17:45
quelle vom benutzer
In anderen Sprachen...                            


1 antworten

stimmen
1

Der AVL - Baum Artikel auf Wikipedia alle , die Sie brauchen diese Art von Selbst ausgeglichenen Baum zu implementieren (Ich mag besonders das Bild Rotationen benötigt für Rebalancing zeigt). Grundsätzlich müssen Sie linke und rechte Baum Rotation und verwenden Sie es in Ihren umzusetzen addund removeMethoden gemäß den im Artikel angegebenen Regeln.

Wenn Sie Abenteurer sind, versuchen , eine rot-schwarz - Baum zu implementieren. Eine gute Beschreibung mit Pseudo - Code finden Sie in Einführung in Algorithmen .

Beantwortet am 02/06/2011 um 17:56
quelle vom benutzer

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