Τροποποιήστε μια BinarySearchTree να εξισορροπηθεί (AVL): Java

ψήφοι
2

Θα πρέπει να τροποποιήσετε ένα δυαδικό Αναζήτηση δέντρο που δημιουργήθηκε για να διαβεβαιώσω ότι είναι ισορροπημένη. Το μόνο που χρειάζεται να τροποποιήσετε το πρόσθετο και αφαιρέστε τις μεθόδους, σύμφωνα με τις οδηγίες μου. Εδώ είναι αυτό που έχω σήμερα:

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

Δεν ψάχνω για κάποιον να με τα πόδια μέσα από αυτή την ανάθεση - απλά ψάχνει για κάποια συμβουλή για το πώς θα πρέπει να πάει για να κάνει αυτό έτσι ώστε να μην σπάσει τον κώδικα στη μέση στο Υποθέτω ότι θα χρειαστείτε. να κάνει κάτι με την έννοια του ελέγχου της παράγοντα ισορροπίας του δέντρου προστίθεται κάθε φορά που κάτι ή να αφαιρεθεί, τότε ανακατασκευάσει το δέντρο ή «περιστροφή» όταν είναι ανισόρροπη.

Ευχαριστώ για οποιαδήποτε συμβουλή εκ των προτέρων. :) Απολαύστε όλες τις συμβουλές.

-Chris

Δημοσιεύθηκε 02/06/2011 στις 17:45
πηγή χρήστη
Σε άλλες γλώσσες...                            


1 απαντήσεις

ψήφοι
1

Το δέντρο AVL άρθρο σχετικά με Wikipedia δίνει όλα όσα χρειάζεστε για την υλοποίηση αυτού του είδους της αυτο-ισορροπημένο δέντρο (Μου αρέσει ιδιαίτερα η εικόνα δείχνει περιστροφές απαιτούνται για την επανεξισορρόπηση). Βασικά θα πρέπει να εφαρμόσουν αριστερά και δεξιά περιστροφή δέντρο και να το χρησιμοποιήσετε σε σας addκαι removeτις μεθόδους σύμφωνα με τους κανόνες που αναφέρονται στο άρθρο.

Αν είστε πιο τολμηροί, δοκιμάστε εφαρμογή ένα κόκκινο-μαύρο δέντρο. Μια καλή περιγραφή με κωδικό ψευδο μπορεί να βρεθεί στην Εισαγωγή στους Αλγόριθμους .

Απαντήθηκε 02/06/2011 στις 17:56
πηγή χρήστη

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