Modificarea unei BinarySearchTree care urmează să fie echilibrat (AVL): Java

voturi
2

Am nevoie pentru a modifica un arbore binar de căutare pe care l-am creat pentru a se asigura că este echilibrată. Am nevoie doar de a modifica a adăuga și elimina metode, în conformitate cu instrucțiunile mele. Iată ce am în prezent:

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

Nu caut pe cineva care să mă plimbe prin această misiune - pur și simplu în căutarea unor sfaturi cu privire la modul în care ar trebui să mă duc despre a face acest lucru, astfel încât să nu rupe codul jumătate de drum în Sunt ghicitul că am avea nevoie. să facă ceva la efectul de verificare a factorului de echilibru al arborelui este adăugat sau îndepărtat de fiecare dată când ceva, apoi reconstrui arborele sau „rotați“ când este dezechilibrat.

Multumesc pentru orice sfat dat în avans. :) Apreciez toate sfaturile.

-Chris

Întrebat 02/06/2011 la 17:45
sursa de către utilizator
În alte limbi...                            


1 răspunsuri

voturi
1

Copac AVL articol pe Wikipedia oferă tot ce trebuie să pună în aplicare acest tip de arbore auto echilibrat (Îmi place în special imaginea care prezintă rotații necesare pentru reechilibrarea). Practic trebuie să pună în aplicare rotația arborelui stânga și la dreapta și de a folosi - l în addși removemetodele în conformitate cu regulile prezentate în articol.

Dacă sunteți mai aventuros, încercați implementarea unui copac roșu-negru. O descriere bună cu cod pseudo poate fi găsit în Introducere în algoritmi .

Publicat 02/06/2011 la 17:56
sursa de către utilizator

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