Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 14

Discussione: Come fareste...

  1. #1

    Come fareste...

    Una visita Postorder in un albero, che non sia ricorsiva?

    Non ci sto riuscendo....non riesco a fare si che i nodi vengano visitati correttamente.

  2. #2
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    che significa visita PostOrder?
    posta il tuo codice, magari partiamo da quello

  3. #3
    Allora io ho una classe albero che implementa questa interfaccia:

    codice:
    public interface IterativeBST<E> {
    public int size ();
    // ritorna il numero di nodi dell'albero
    public void insert (E x);
    // inserisce un nuovo elemento nell'albero
    public boolean search (E x);
    // ritorna true se l'elemento E č contenuto nell'albero
    public void RightRotate(E x);
    // effettua una rotazione destra sul nodo che contiene x
    public E succesor(E x);
    // ritorna l'elemento successivo di x
    }
    Mi hanno detto che non sono corretti nemmeno i metodi RightRotate e successor, a parte questo, sto continuando a scrivere e cancellare, perchč non sto riuscendo a implementare il metodo PostOrder dell'albero iterativo.
    Non riesco con i cicli a fare in modo che scenda e stampi figlio sinistro e destro e poi passi alla radice.
    Mi ricordo che forse per trasformare un metodo da ricorsivo ad iterativo si doveva utilizzare uno stack, ma non so come....posto il codice ma il metodo postorder č vuoto perchč qualunque cosa scriva non va.
    Forse si puņ utilizzare uno stack? Se si...come?
    P.S il metodo non č indicato nell'interfaccia ma l'esercizio vuole che si implementi una postorder non ricorsiva:

    codice:
    public class BSTree<E>  implements  IterativeBST<E>
    {
    	private int size;
    	private TNode<E> root;
    	
    	public BSTree()
    	{
    		root=null;
    		size=0;
    	}
    		
    	public void setRoot(TNode<E> nodo){this.root=nodo;}
    	
    	public TNode<E> getRoot(){return root;}
    	
    	public int size(){return size;}
    	
    	public void insert(E node){
    		if(size()==0){
    			setRoot((TNode)node);
    		}
    		
    			else{
    				TNode<E> current=getRoot();
    				boolean inserito=false;
    			
    			while(!inserito)
    			{			
    			
    				if(((Coppia)current.getElement()).compareTo(((Coppia)((TNode)node).getElement()))<0)
    				{
    					if(!(current.hasRight()))
    					{
    						current.setRight((TNode)node);
    						((TNode)node).setParent(current);
    						inserito=true;
    					}
    					else current=current.getRight();
    				}
    			
    				else if(((Coppia)current.getElement()).compareTo(((Coppia)((TNode)node).getElement()))>0)
    				{
    					if(!(current.hasLeft()))
    					{
    					current.setLeft((TNode)node);
    					((TNode)node).setParent(current);
    					inserito=true;
    					}
    					else current=current.getLeft();
    				}
    			}
    			}
    		size++;
    	}
    	
    	public boolean search (E node){
    		assert getRoot()!=null;
    		TNode<E> current=getRoot();
    		boolean trovato=false;
    		
    		while(!trovato && current!=null)
    		{
    			if(current.equals((TNode)node)){
    				trovato=true;}
    			
    			else if(((Coppia)current.getElement()).compareTo(((Coppia)((TNode)node).getElement()))<0){
    				current=current.getRight();}
    				
    			else current=current.getLeft();
    		}
    		
    		return trovato;
    	}
    	
    	public void RightRotate(E node){
    		if(node==null) return;
    		if(((TNode)node).getLeft()==null) return;
    		
    		TNode<E> y=((TNode)node).getLeft();
    		y.setParent(((TNode)node).getParent());
    	}
    	
    	public E succesor(E node){
    		TNode<E> toReturn=((TNode)node).getRight();
    		return (E)toReturn;
    	}
    	
    	public String postorder()
    	{
    	}
    	
    }
    codice:
    public class Coppia<E>
    {
    	int primo, secondo;
    	
    	public Coppia(int primo, int secondo)
    	{
    		this.primo=primo;
    		this.secondo=secondo;
    	}
    	
    	public int compareTo(Coppia<E> coppia){                     //Una coppia č maggiore se la somma degli elementi č maggiore di quella dell'altra coppia, non possono mai essere uguali
    		int somma1=getPrimo()+getSecondo();
    		int somma2=coppia.getPrimo()+coppia.getSecondo();
    		
    		if(somma1<somma2) return -1;
    		
    		else return 1;
    	}
    	
    	public int getPrimo(){return primo;}
    	
    	public int getSecondo(){return secondo;}
    	
    	public String toString()
    	{
    		return "("+getPrimo()+","+getSecondo()+")";
    	}
    }
    codice:
    public class TNode<E>
    {
    	private E element;
    	private TNode<E> parent;
    	private TNode<E> left;
    	private TNode<E> right;
    	
    	public TNode(E element)
    	{
    		this.element=element;
    		parent=null;
    		left=null;
    		right=null;
    	}
    	
    	public void setElement(E element){this.element=element;}
    	
    	public E getElement(){return element;}
    	
    	public void setParent(TNode<E> parent){this.parent=parent;}
    	
    	public TNode<E> getParent(){return parent;}
    	
    	public void setLeft(TNode<E> left){this.left=left;}
    	
    	public TNode<E> getLeft(){return left;}
    	
    	public void setRight(TNode<E> right){this.right=right;}
    	
    	public TNode<E> getRight(){return right;}
    	
    	public boolean hasLeft(){return left!=null;}
    	
    	public boolean hasRight(){return right!=null;}
    	
    	
    }

  4. #4
    C'č un motivo particolare per il quale non vuoi utilizzare la ricorsione? Ricorsivamente l'algoritmo č banalissimo, lo si implementa con pochissime righe di codice.
    "Mai discutere con un idiota. Ti trascina al suo livello e ti batte con l'esperienza." (Oscar Wilde)

  5. #5
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Originariamente inviato da satifal
    C'č un motivo particolare per il quale non vuoi utilizzare la ricorsione? Ricorsivamente l'algoritmo č banalissimo, lo si implementa con pochissime righe di codice.
    Sarą per un esercizio immagino...
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  6. #6
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    Originariamente inviato da Alex'87
    Sarą per un esercizio immagino...
    si solo che senza ricorsione diventa un macello....provo a fare un pensiero, proviamo dato un nodo (root) scorri a destra e a sinistra, quindi stampa il valore di destra e di sinistra...puoi usare questa funzione dentro una marea di cicli...ma č un bel casotto!!

  7. #7
    Si č per un esercizio che richiede che tutti i metodi siano fatti senza ricorsione.....ma mi sento perduto..

  8. #8
    la postorder ricorsiva č un casino...si utilizza uno stack. Non capisco eprchč il Prof ci deve far complicare sempre piu la vita.

  9. #9
    la postorder ricorsiva č un casino
    Volevi dire iterativa?

    Io non so come si debba fare, uqindi in tutto quello che devo fare devo anche creare la struttura dati e scegliere come implementarla. Ma poi come lo usi nella postorder?
    Io mi sono bloccato..

  10. #10
    si scusa iterativa...cmq sul web trovi tutto, basta solo un pņ di pazienza e cercare

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.