dengeli edilecek bir BinarySearchTree (AVL) değiştirin: Java

oy
2

Ben bunu dengeli olduğundan emin olmak için oluşturulan bir ikili arama ağacı değiştirmeniz gerekir. Ben sadece talimatlara göre, eklenti değiştirebilir ve yöntemleri kaldırmak gerekir. İşte şu anda ne var:

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

Bu görev aracılığıyla bana yürümek için birini aramıyorum - basitçe ben kod yarı yolda kırmak kalmamak bunu hakkında gitmeli nasıl bazı tavsiyeler arıyorum ben gerekeceğini tahmin ediyorum. o dengesiz olduğunda her zaman bir şeyler eklenir veya kaldırılır ağacın denge faktörü kontrol etkisi için bir şeyler yapmak, daha sonra ağaç ya da 'döndürme' yeniden.

Önceden herhangi bir tavsiye için teşekkürler. Tüm ipuçlarını takdir :).

-Chris

Oluştur 02/06/2011 saat 17:45
kaynak kullanıcı
Diğer dillerde...                            


1 cevaplar

oy
1

AVL ağacı Vikipedi'de makalede kendini dengeli ağacın bu tür uygulamak için gereken tüm verir (özellikle gibi resmi yeniden dengeleme için gerekli rotasyonlar gösteriliyor). Temel olarak sol ve sağ ağaç dönüşünü uygulamak ve bunu kullanmak gerekir addve removemakalesinde verilen kurallara göre yöntemlerle.

Eğer daha maceracı iseniz, kırmızı-siyah ağaç uygulamayı deneyin. Sözde koduyla İyi bir açıklama bulunabilir Algoritmalar Introduction to .

Cevap 02/06/2011 saat 17:56
kaynak kullanıcı

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