Modyfikowanie BinarySearchTree być zrównoważone (AVL): Java

głosy
2

Muszę zmodyfikować binarne drzewo poszukiwań że stworzony, aby zapewnić, że jest wyważony. I tylko trzeba zmodyfikować dodawać i usuwać metody, zgodnie z moimi instrukcjami. Oto, co aktualnie mam:

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

Nie szukam kogoś chodzić mi przez tego zadania - po prostu szukasz jakiegoś poradę, w jaki sposób powinny przejść o to zrobić tak, aby nie złamać kod w połowie drogi w Zgaduję, że będę potrzebował. coś zrobić, aby efekt sprawdzenia współczynnika równowagi drzewa za każdym razem coś jest dodane lub usunięte, a następnie odtworzyć drzewo lub zmieniać, gdy jest niezrównoważony.

Dzięki za danym radę z góry. :) Docenić wszelkie wskazówki.

-Chris

Utwórz 02/06/2011 o 17:45
źródło użytkownik
W innych językach...                            


1 odpowiedzi

głosy
1

Drzewo AVL artykuł Wikipedia daje wszystko, czego potrzebujesz do realizacji tego rodzaju drzewa własny zrównoważony (Szczególnie podoba mi się obraz przedstawiający obrotów potrzebnych do zrównoważenia). Zasadniczo należy wdrożyć rotacja drzewa lewo i prawo i używać go w swoich addand removemetod zgodnie z zasadami podanymi w art.

Jeśli jesteś bardziej ryzykowny, spróbuj wdrożenie drzewo czerwono-czarne. Dokładny opis z kodem pseudo można znaleźć w Wstęp do algorytmów .

Odpowiedział 02/06/2011 o 17:56
źródło użytkownik

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