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

    Problema esercizio albero in un array

    C'č uno dei soliti esercizi contorti, che stavo provando a fare ma ho parecchie difficoltą:

    codice:
    Si realizzi un'implementazione delle due interfacce TNode<E> e Tree<E> mostrate nella
    pagina seguente. Le implementazioni fornite, che dovranno essere denominate
    rispettivamente ArrayTNode<E> e ArrayTree<E>, dovranno utilizzare un array per la
    memorizzazione dei nodi dell'albero. I singoli nodi dovranno quindi risiedere all'interno di
    un array mentre i puntatori ai nodi firstSon, sibling e parent dovranno essere espressi
    attraverso indici dell'array.
    In seguito si realizzi un programma Java che preso in input un file contenente una lista di
    nomi (composti da nome e cognome) costruisca un albero completo (ArrayTree<String>)
    dove ogni nodo possiede esattamente 3 figli. Gli elementi verranno forniti in modo da
    costruire l'albero procedendo per livelli (dalla radice alle foglie), e costruendo ciascun livello
    da sinistra verso destra.
    Il programma dovrą stampare in un file di output la visita preorder dell'albero ottenuto,
    utilizzando il metodo toString() della classe ArrayTree.
    Input
    Il file di input contiene una lista di stringhe, una per riga, ciascuna contenente un nome
    seguito da un cognome e separati da uno spazio.
    Output
    Il file di output dovrą contenere una lista di stringhe, una per riga, risultanti dalla visita
    preorder dell'albero ottenuto.
    Ecco le interfacce:

    codice:
    public interface TNode<E> {
    public E element(String nome);
    // ritorna il valore dell'elemento contenuto nel nodo
    public int sibling();
    // ritorna l'indice nell'array del successivo fratello
    public int firstSon();
    // ritorna l'indice nell'array del primo figlio
    public int addChild();
    // inserisce un nuovo figlio in coda alla lista dei figli
    public int parent();
    // ritorna l'indice nell'array del nodo padre
    public int degree();
    // ritorna il numero di figli del nodo
    public void setElement(E element);
    // setta il valore dell'elemento contenuto nel nodo
    }
    
    
    
    public interface Tree<E> {
    public int size();
    // ritorna il numero di nodi presenti nell'albero
    public TNode<E> root();
    // ritorna il nodo radice dell'albero
    public String toString();
    // stampa l'albero, un elemento per riga, utilizzando una
    visita poreorder
    public TNode<E> search(E val);
    // ritorna il nodo che contiene il valore val, null altrimenti
    public E minimum();
    // ritorna il valore minore presente nell'albero
    }
    Ora gią secondo me ci sono errori, intanto element č un metodo che non puņ prendere parametri. Poi non riesco a capire come implementare il metodo AddChild.
    Intanto cosa aggiunge se non prende parametri? Se l'array io lo credo nella classe che implementa Tree, come faccio in una classe che non č altro che la classe nodo, a fare un inserimento se ancora non ho alcun array su cui lavorare?
    Ora siccome restituisce un intero io immagino che indichi qual' č la posizione dove inserire nell'array il nodo.
    Il mio problema č, funziona davvero cosģ? Come faccio a mano a mano, dopo che inserisco i vari nodi a modificare i relativi indici a parent, sibling....eccetera?

    Ho scritto qualcosa..

    codice:
    public class ArrayTNode<E> implements TNode<E>
    {
    	private E element;
    	private int sibling;
    	private int firstSon;
    	private int parent;
    	private int degree;
    	private int position;
    	private ArrayTNode<E> next;
    	
    	
    	public ArrayTNode(E element){
    		this(element,0);
    	}
    	public ArrayTNode(E element, int position){
    		this(element,position,-1);
    		}
    		
    		public ArrayTNode(E element, int position, int sibling){
    			this(element, position, sibling, -1);
    		}
    		
    		public ArrayTNode(E element, int position, int sibling, int firstSon){
    			this(element, position, sibling, firstSon, -1);
    		}
    		public ArrayTNode(E element, int position, int sibling, int firstSon, int parent){
    			this(element, position, sibling, firstSon, parent, 0);
    		}
    		public ArrayTNode(E element, int position, int sibling, int firstSon,  int parent, int degree){
    			this(element,position, sibling, firstSon, parent, degree, null);
    		}
    		
    		public ArrayTNode(E element, int position, int sibling, int firstSon,  int parent, int degree, ArrayTNode<E>next){
    			this.element=element;
    			this.position=position;
    			this.sibling=sibling;
    			this.firstSon=firstSon;
    			this.parent=parent;
    			this.degree=degree;
    			this.next=next;
    		}
    			
    	public E element(){return element;}
    	
    	public int getPosition(){return position;}
    	
    	public ArrayTNode<E> getNext(){return next;}
    	
    	public ArrayTNode<E> getNode(){ return this;}
    	
    	public int sibling(){return sibling;}
    	public int firstSon(){return firstSon;}
    	
    	public int addChild(){
    		int startposition=this.getPosition();
    		ArrayTNode<E> tmp=getNode();
    		
    		int posbrother=tmp.sibling();                 
    		
    		if(posbrother==-1)                           //se il nodo non ha figli inserisco nella posizione dopo
    			return startposition+1;
    			
    			else{
    				while(posbrother!=-1){
    					tmp=tmp.getNext();
    					posbrother=tmp.sibling();                     //sennņ arrivņ all'ultimo figlio e lo aggiungo dopo
    					startposition=tmp.getPosition();
    					
    				}
    			}
    			
    		  return startposition+1;
    		}
    				
    	public int parent(){return parent;}
    	
    	public int degree(){return degree;}
    	
    	public void setElement(E element){this.element=element;}
    }

    codice:
    public class ArrayTree<E extends Comparable<E>> implements Tree<E>
    {
    	public static final int max=100;
    	private int size;
    	protected ArrayTNode<E>[] array;
    	
    	public ArrayTree()
    	{
    		array=(ArrayTNode<E>[]) new Object[max];
    		size=0;
    	}
    
    	public int size(){return size;}
    	
    	public TNode<E> root(){return array[0];}
    	
    	
    	public String toString(){
    	}
    	
    	public TNode<E> search(E val){
    		for(int i=0; i<array.length; i++){
    			if(array[i].equals(val))
    				return array[i];
    		}
    		
    		return null;
    	}
    	
    	public E minimum(){
    		E min=array[0].element();
    		for(int i=0; i<array.length; i++){
    			if(min.compareTo(array[i].element())>0)
    				min=array[i].element();
    		}
    		
    		return min;
    	}
    }

  2. #2

    Albero tramite array

    Ho un problema, se devo implementare un albero tramite array, dove ogni locazione dell'array contiene un nodo dell'albero, e il nodo contine l'elemento, un indice che si riferisce alla posizione nell'array dove č localizzato il padre, e un altro indice per il primo fratello.
    Devo realizzare l'albero in modo che sia completo e che ogni nodo abbia 3 figli.
    Come posso fare?
    Voglio dire, creando i nodi e inserendo gli elementi come faccio esattamente a sapere dove sarą il primo figlio, come faccio a settare i vari parametri...

  3. #3
    Io conosco l'implementazione di un albero BINARIO con array, ossia un albero dove ogni nodo ha AL MASSIMO due figli. Non so se quello che ti sto per dire vale per un albero non binario, poichč ogni nodo ha esattamente 3 figli nel tuo caso ma potresti adattare l'idea. Per rappresentare un albero binario con un array, la radice dell'albero č contenuta nella sua prima posizione ed i figli della radice occupano la posizione 2i e 2i+1, dove i č appunto la posizione della radice, o meglio del padre dei due figli.

  4. #4
    Ciao,

    dunque, se non ho capito male quello che ti serve, la cosa dovrebbe essere abbastanza facile.
    La cosa viene semplice anche se implementata con liste, ma in questo caso viene un albero n-ario, invece a te serve con 3 figli per ogni nodo, quindi va bene l'uso di array (in questo caso di tre elementi).
    Spiego con un disegno:

    In pratica hai un nodo radice che punta ad un'array di 3 elementi. Ogni cella dell'array a sua volta punta ad un altro array di 3 elementi (o meglio al primo elemento di ogni array), e cosģ via ricorsivamente.
    La cosa č di facile implementazione. Ricordo ancora di quando lo facevo 7-8 anni fa ai corsi di fondamenti di informatica, ma si usavano le liste.

    Spero di averti dato un'idea.

  5. #5
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Originariamente inviato da fbcyborg
    In pratica hai un nodo radice che punta ad un'array di 3 elementi. Ogni cella dell'array a sua volta punta ad un altro array di 3 elementi (o meglio al primo elemento di ogni array), e cosģ via ricorsivamente.
    Da quel che ho capito rileggendo quello che ha scritto Darčios89, lui vuole usare un unico array per tutto l'albero. In pratica vorrebbe creare una versione a tre figli di uno [url=http://en.wikipedia.org/wiki/Binary_heap]heap binario[/b]
    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
    Bč...si, Alex ha capito

    A dire il vero l'esercizio sarebbe questo, l'ho postato ma non mi hanno risposto.
    Ho avuto dei problemi nel fare quello che mi si diceva, potreste aiutarmi?
    Vi dņ il link alla discussione che avevo aperto, sono abbastanza dubbioso, e bloccato nell'esercizio, ve ne sarei grato se mi aiutaste a capire come fare...e correggere quello che ho gią fatto:

    http://forum.html.it/forum/showthrea...readid=1424384

    P.S. credo si debba usare un solo array, perchč l'albero č interamente rappresentato da un array, poi non so.

  7. #7
    Ah, ok ho capito.
    Dunque immagino che serva l'implementazione di un'array dinamico. Ovviamente pił complesso di quello che ho schematizzato io...

  8. #8
    Dovrebbe bastarmi un array di 100 locazioni, perņ il problema č che non so come fare a gestire gli indici.

    Praticamente per i primi 4 nodi non ho problemi, perchč siccome ogni nodo avrą 3 figli, la radice č in posizione 0, e nelle posizioni 1,2 e 3 avrņ i 3 figli, ma poi mi perdo dalla casa
    Cioč non so come fare ad aggiungere, perchč dovrei sapere per ogni nodo che metto dove si troverą dopo il figlio, e cosģ via......

  9. #9
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Originariamente inviato da Darčios89
    Praticamente per i primi 4 nodi non ho problemi, perchč siccome ogni nodo avrą 3 figli, la radice č in posizione 0, e nelle posizioni 1,2 e 3 avrņ i 3 figli, ma poi mi perdo dalla casa
    Cioč non so come fare ad aggiungere, perchč dovrei sapere per ogni nodo che metto dove si troverą dopo il figlio, e cosģ via......
    Beh...
    In 0 c'č root e in 1 2 3 i suoi figli. In 4 5 6 ci saranno i figli di 1, in 7 8 9 i figli di 2, in 10 11 12 i figli di 3, in 13 14 15 i figli di 4 e cosģ via... Fai quattro conti e prova a ricavarti una formuletta
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  10. #10
    Utente di HTML.it L'avatar di desa
    Registrato dal
    Oct 2008
    Messaggi
    569
    La soluzione di Alex'87 č certamente pił elegante per il problema specifico... comunque, poichč ogni nodo ha un puntatore a parent, sibling e firstSon (sotto forma di indice integer, quindi attento ai valori che vai a mettere per questi tre puntatori - rispettivamente - nel nodo radice, nel terzo figlio di ogni nodo e nei nodi foglia) in realtą, ai fini della visita dell'albero, non ti interessa la posizione in cui esso si troverą all'interno dell'array: tutte le informazioni necessarie per trovare i suoi "vicini" e "parenti" sono proprio in questi tre puntatori.

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.