Wijzigen van een BinarySearchTree te worden afgewogen (AVL): Java

stemmen
2

Ik moet een binaire zoekboom die ik heb gemaakt om te verzekeren dat het in balans te wijzigen. Ik hoef alleen maar om de add te wijzigen en te verwijderen methoden, volgens mijn instructies. Hier is wat ik momenteel:

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

Ik ben niet op zoek naar iemand om me te lopen door deze opdracht - gewoon op zoek naar wat advies over hoe ik moet gaan over dit te doen, zodat ik niet de code halverwege breken Ik denk dat ik nodig hebt. om iets te doen om het effect van het controleren van de balans factor van de boom elke keer als er iets wordt toegevoegd of verwijderd, dan is de boom of 'draaien' reconstrueren als het onevenwichtig.

Bedankt voor alle advies gegeven op voorhand. :) Geniet van alle tips.

-Chris

De vraag is gesteld op 02/06/2011 om 17:45
bron van user
In andere talen...                            


1 antwoorden

stemmen
1

De AVL boom artikel op Wikipedia geeft alles wat je nodig hebt om dit soort self-gebalanceerde boom uit te voeren (Ik vond vooral het beeld laten zien rotaties nodig voor rebalancing). In principe moet je links en rechts boom rotatie implementeren en gebruiken in uw adden removemethoden volgens de regels die in het artikel.

Als u meer avontuurlijk, probeer dan de uitvoering van een rood-zwarte boom. Een goede beschrijving met pseudo-code kan worden gevonden in Introduction to Algorithms .

antwoordde op 02/06/2011 om 17:56
bron van user

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