Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 17
  1. #1

    Albero autobilanciato

    Ciao ragazzi stavo svolgendo questo esercizio; ecco qui il testo:
    http://www.dmi.unict.it/~faro/prog2/...8/zg8rfct2.pdf

    Non so implementare solamente il metodo selfBallace(); in pratica a ricevimento il professore mi ha consigliato di non implementare right rotate e left rotate, bensì utilizzare una coda e poi richiamare una preorder per creare l'albero riempendo i nodi da sx a dx, così da averlo bilanciato.

    Ecco il codice che ho fatto finora:
    codice:
    /*
     * To change this template, choose Tools | Templates
     * and open the template in the editor.
     */
    
    
    
    /**
     *
     
     */
    //import java.lang.RuntimeException;
    //import java.util.Queue;
    import java.util.LinkedList;
    public class Main {
    
        /**
         * @param args the command line arguments
         */
        public static void main(String[] args) throws Exception {
            // TODO code application logic here
            AlberoBilanciato a=new AlberoBilanciato();
            a.insert("C");
            a.insert("D");
            a.insert("B");
            a.insert("A");
            a.preorder();
            System.out.println("Altezza albero "+a.height());
            System.out.println("Size albero "+a.size());
            System.out.println("L'albero è bilanciato? "+a.isBallanced(a.root));
            System.out.println("Size del nodo B "+a.size(a.root.left));
            System.out.println("Cancellazione di un elemento");
            a.delete("C");
            a.preorder();
            System.out.println(a.Left(a.root()).info);
            System.out.println("L'albero è bilanciato? "+a.isBallanced(a.root));
            a.selfBallance();
            System.out.println("L'albero è bilanciato? "+a.isBallanced(a.root));
        }
    
    }
    interface SelfBallancedTree
    {
        public int size();
        public BTNode root() throws EmptyTreeException;
        public BTNode left(BTNode x) throws InvalidArgumentException;
        public BTNode right(BTNode x) throws InvalidArgumentException;
        public BTNode parent(BTNode x) throws InvalidArgumentException;
        public int size(BTNode x) throws InvalidArgumentException;
        public void insert(String s);
        public BTNode delete(String s);
        public boolean isBallanced(BTNode x);
        public void selfBallance();  //Mi manca questo solamente
    }
    class BTNode
    {
        protected String info; //info nodo
        protected BTNode parent,left,right;
    
        public BTNode()
        {
            info=null;
            parent=left=right=null;
        }
        public BTNode(String in)
        {
            info=in;
            parent=left=right=null;
        }
        public void visit()
        {
            System.out.println(" "+info);
        }
    
    }
    class AlberoBilanciato implements SelfBallancedTree
    {
        protected BTNode root;
        protected int size,height;
    
        public AlberoBilanciato()
        {
            root=null;
            size=0;
            height=0;
        }
        public int size(){return size;}
        public int height(){return getAltezzaNodo(root);}
        public BTNode root(){return root;}
        public boolean isBallanced(BTNode x)
        {
            int bf=getAltezzaNodo(x.left)-getAltezzaNodo(x.right);
            return ((bf>=-1)&& (bf<=1));
        }
        public BTNode left(BTNode x) throws InvalidArgumentException
        {
            BTNode tmp=Search(x.info);
            BTNode te=tmp.left;
            if(te==null)
                throw new InvalidArgumentException("Left non presente");
            return te;
        }
        public BTNode Left(BTNode x) throws InvalidArgumentException
        {
            if(x==null)
                throw new InvalidArgumentException("");
            return x.left;
        }
        public BTNode right(BTNode x) throws InvalidArgumentException
        {
            BTNode tmp=Search(x.info);
            BTNode te=tmp.right;
            if(te==null)
                throw new InvalidArgumentException("Right non presente");
            return te;
        }
        public BTNode parent(BTNode x) throws InvalidArgumentException
        {
            BTNode tmp=Search(x.info);
            BTNode te=tmp.parent;
            if(te==null)
                throw new InvalidArgumentException("Right non presente");
            return te;
        }
        public BTNode Search(String info)
        {
            BTNode p=root;
            while(p!=null)
            {
                int res=((Comparable)info).compareTo(p.info);
                if(res==0)
                    return p;
                else if(res>0)
                    p=p.right;
                else
                    p=p.left;
            }
            return null;
        }
        public void insert(String s)
        {
            BTNode d=new BTNode(s);
            if(root==null)
                root=d;
            else
            {
                BTNode p=root,pred=null;
                while(p!=null)
                {
                    if(s.equals(p.info))
                        return;
                    pred=p;
                    if(s.compareTo(p.info)<0)
                        p=p.left;
                    else
                        p=p.right;
                }
                if(s.compareTo(pred.info)<0)
                {
                    pred.left=d;
                    d.parent=pred;
                }
                else
                {
                    pred.right=d;
                    d.parent=pred;
                }
            }
            size++;
        }
        public void inorder()
        {
            inorder(root);
        }
        public void inorder(BTNode p)
        {
            if(p!=null)
            {
                inorder(p.left);
                p.visit();
                inorder(p.right);
            }
        }
        public void preorder()
        {
            preorder(root);
        }
        public void preorder(BTNode p)
        {
            if(p!=null)
            {
                p.visit();
                preorder(p.left);
                preorder(p.right);
            }
        }
        public int getAltezzaNodo(BTNode p)
        {
            return getAltezzaNodo(p,0);
        }
        public int getAltezzaNodo(BTNode p,int altezza)
        {
            if(p!=null)
            {
                if(p.left==null && p.right==null)
                    return altezza;
                else
                {
                    int a=getAltezzaNodo(p.left,altezza+1);
                    int b=getAltezzaNodo(p.right,altezza+1);
                    if(a>b)
                        return a;
                    else
                        return b;
                }
            }
            return altezza-1;
        }
        public int size(BTNode x) throws InvalidArgumentException
        {
            if(x==null)
            {
                return 0;
            }
            else
            {
                int nodisx=size(x.left);
                int nodidx=size(x.right);
                return 1+nodisx+nodidx;
            }
        }
        public BTNode min(BTNode y)
        {
            BTNode x=Search(y.info);
            while(x.left!=null)
                x=x.left;
            return x;
        }
        public BTNode successore(BTNode y)
        {
            BTNode x=Search(y.info);
            if(x.right!=null)
                return min(x.right);
            y=x.parent;
            while(x!=null && x==y.right)
            {
                x=y;
                y=y.parent;
            }
            return y;
        }
        public BTNode delete(String s)
        {
            BTNode x=new BTNode(s);
            BTNode z=Search(x.info);
            BTNode y;
            if(z.left==null || z.right==null)
            {
                y=z;
            }
            else
                y=successore(z);
            if(y.left!=null)
                x=y.left;
            else
                x=y.right;
            if(x!=null)
                x.parent=y.parent;
            if(y.parent==null)
                root=x;
            else 
                if(y.parent.left==y)
                    y.parent.left=x;
                else
                    y.parent.right=x;
            if(y!=z)
                z.info=y.info;
            return y;
        }
        public void selfBallance()
        {
            if(this.isBallanced(root))
                System.out.println("Non è necessario il bilanciamento");
            else
                //System.out.println("Applicarlo");
            {
                BTNode p=root;
                preordercrea(p);
            }
         }
         public void preordercrea(BTNode p)
         {
             if(p!=null)
             {
                 Coda c=new Coda();
                 c.enQueue(p.info);
                 while(p.left!=null || p.right!=null)
                 {
                     c.enQueue(p.left);
                     c.enQueue(p.right);
                 }
                 size++;
             }
         }
    
    }
    class Coda{
    	protected NodoL head;
    	protected NodoL tail;
    	public Coda(){
    		head=tail=null;
    	}
    
    	public boolean isEmpty(){
    		return head==null;
    	}
    
    	public void enQueue(Object info){
    		NodoL x = new NodoL(info);
    		if(isEmpty())
    			head=tail=x;
    		else{
    			tail.setNext(x);
    			tail=x;
    		}
    	}
    
    	public Object deQueue() {
    		try{
    		if(isEmpty())
    			throw new InvalidArgumentException("ERRORE: la coda e' vuota. Impossibile estrarre elementi");
    		else{
    			Object ret = head.getInfo();
    			head=head.getNext();
    			return ret;
    		}
    	}catch(Exception e){ System.out.println(e.getMessage());
    		return null;}
    	}
    
    	public Object readHead(){
    		try{
    		if(isEmpty())
    			throw new InvalidArgumentException("ERRORE: la coda e' vuota. Impossibile leggere elementi");
    		else
    			return head.getInfo();
    		}catch(Exception e){ System.out.println(e.getMessage());
    		return null;}
    	}
    
    	public void makeEmpty(){
    		head=tail=null;
    	}
    
    	public String toString(){
    		String str="";
    		if(isEmpty())
    			str+="La coda e' vuota...";
    		else{
    			str+="<- ";
    			NodoL aux=head;
    			for(; aux!=null; aux=aux.getNext())
    				str+=aux.getInfo()+" ";
    			str+=" <-";
    		}
    		return str;
    	}
    
    }
    class NodoL{
    	private Object info;
    	private NodoL next;
    
    	public NodoL(Object info){
    		this(info,null);
    	}
    
    	public NodoL(Object info, NodoL next){
    		this.info=info;
    		this.next=next;
    	}
    
    	public void setInfo(Object info){
    		this.info=info;
    	}
    
    	public Object getInfo(){
    		return info;
    	}
    
    	public void setNext(NodoL next){
    		this.next=next;
    	}
    
    	public NodoL getNext(){
    		return next;
    	}
    
    	public String toString(){
    		return ""+info;
    	}
    }
    class InvalidArgumentException extends Exception
    {
        public InvalidArgumentException() {
        }
    
    
        /**
         * Constructs an instance of <code>InvalidArgumentException</code> with the specified detail message.
         * @param msg the detail message.
         */
        public InvalidArgumentException(String msg) {
            super(msg);
        }
    }
    class EmptyTreeException extends Exception
    {
        public EmptyTreeException(){
    
        }
        public EmptyTreeException(String msg){
            super(msg);
        }
    }

  2. #2
    Utente di HTML.it L'avatar di bstefano79
    Registrato dal
    Feb 2004
    Messaggi
    2,520
    subito una cosa che mi è risaltata all'occhio

    codice:
      BTNode tmp=Search(x.info);
            BTNode te=tmp.left;
            if(te==null)
                throw new InvalidArgumentException("Left non presente");
            return te;
    cosa succede se search non trova il nodo???? che tmp è nullo quindi quando andrai a fare BTNode te=tmp.left; ti solleverà un NullPointerException. Parti modificando così

    codice:
            BTNode tmp=Search(x.info);
            if(tmp==null || tmp.left==null)
                throw new InvalidArgumentException("Left non presente");
           return tmp.left;

  3. #3
    Vabbè, questo ok, me ne sono accorta ora, ma il problema non è questo. Grazie :-(

  4. #4
    Utente di HTML.it L'avatar di bstefano79
    Registrato dal
    Feb 2004
    Messaggi
    2,520
    E su quello che ti ha detto il prof cosa è che non ti torna????

  5. #5
    A livello di codice non sò come realizzarlo

  6. #6
    Nessuno sa darmi una mano? pleaseeee

  7. #7
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,480

    Moderazione

    Originariamente inviato da sicula83
    A livello di codice non sò come realizzarlo
    Prova a proporre una tua soluzione e, in caso di errori o problemi, riportala così possiamo analizzarla e darti un suggerimento in proposito.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  8. #8
    Grazie intanto per aver risposto, sto eseguendo anche io questo progettino e il problema sta nel fatto che per il metodo selfBallance si deve ribilanciare l'intero albero; quindi si dovrebbe crearne uno nuovo utilizzando una coda di supporto dove inserire i nostri nodi e poi con opportune operazioni di dequeue andarli a inserire nell'albero; per esempio ho una situazione simile di albero binario: 3-5-7-9-11-13; quest'albero è totalmente sbilanciato, quindi devo effettuare questo bilanciamento. Devo inserire quindi i miei nodi in un albero completando l'ultimo livello da sx a dx e poi riempirlo con una preorder o postorder..
    Più tardi posterò un esempio grafico per fare capire cosa mi è stato spiegato a ricevimento dal docente.

  9. #9
    Grazie per aver risposto...il problema è che non ho proprio idea
    Avevo pensato ad una rotazione a destra(right rotate) ed effettivamente il ragionamento funziona ma il Prof dice che è sbagliato risolverlo così :-(

  10. #10
    Utente di HTML.it L'avatar di bstefano79
    Registrato dal
    Feb 2004
    Messaggi
    2,520
    inizia a fare un metodo che se gli da in pasto un albero ti genera la lista
    poi farai un altro metodo che dato una lista ti costruisce un albero bilanciato

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.