|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Jun 2005
Città: Napoli
Messaggi: 2599
|
[C] albero n-ario ==> binario
salve a tutti, sono giorni che tento di fare un algoritmo per trasformare un albero enario in uno binario, ma senza successo. Ho un albero di questo tipo:
![]() ogni nodo è una struct che ha un link al primo figlio e uno ai fratelli. Devo trasformarlo in un albero binario. Ecco un esempio: ==> ![]() se un nodo ha più di due figli, aggiungo un nodo X per rispettare il "binario", ma i nodi 2, 6, 7 hanno lo stesso livello, anche se ho inserito la x, come i 3 4 5. Come potrei fare???? grazie
__________________
Hp pavilion dv6-1250el [cpu: P8700 - ati radeon hd 4650 1 gb - 4 gb ram - hd 320 7200 rpm!] Garmin Official Thread Ultima modifica di gepeppe : 28-11-2007 alle 10:12. |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Feb 2004
Messaggi: 1454
|
il modo migliore è son-brother, ma da come descrivi la struct sembra sia già in quella forma. quindi il tuo albero generico è già memorizzato in una struttura dati ad albero binario, devi solo imparare ad usarla.
un albero son-brother, come dice il nome stesso, è un albero in cui ogni nodo punta ad un figlio e ad un fratello. di solito a sinistra c'è il figlio e a destra il fratello. in c la struct sarebbe tipo questa Codice:
struct nodo
{
int label;
nodo* son;
nodo* brother;
}
il risultato è questo (le frecce orizontali indicano il puntamento di destra, ovvero ai fratelli, quelli verticali indicano il puntamento a sinistra, ovvero ai figli):
Ultima modifica di Furla : 28-11-2007 alle 16:33. |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Jun 2005
Città: Napoli
Messaggi: 2599
|
ma scusa, un albero binario non è un albero in cui ogni nodo ha al massimo due figli?? Il mio problema è appunto trasformare (o soltanto stampare) un albero n-ario, con n figli per nodo, in un albero binario, con 2 figli per nodo, rispettando oviamente il fatto che se il nodo 2 ha 4 figli(i quali stanno tutti allo stesso livello) dopo il nodo 2 nell'albero binario avrà ancora 4 figli (che dovranno ipoteticamente stare nello stesso livello). Per questo faccio uso dei nodi X.
L'immagine che hai postato è proprio la mia idea di albero n-ario...ma la stampa e la trasformazione in albero binario non mi sono chiari.... io la vedo ancora una cosa molto complicata, ma purtroppo ne ho bisogno...
__________________
Hp pavilion dv6-1250el [cpu: P8700 - ati radeon hd 4650 1 gb - 4 gb ram - hd 320 7200 rpm!] Garmin Official Thread |
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2782
|
Non ho capito la storia dello stare allo stesso livello, cioè, nel tuo esempio la X non conta ai fini del livello?
E poi un'altra cosa, il tuo esempio è con nodi di al massimo 3 figli ma il tuo algoritmo può prendere in input un albero con nodi con un qualunque numero di figli? |
|
|
|
|
|
#5 | |
|
Senior Member
Iscritto dal: Feb 2004
Messaggi: 1454
|
Quote:
|
|
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Jun 2005
Città: Napoli
Messaggi: 2599
|
uso il nodo X per fare in modo che i figli di un certo nodo, anche se più di due, stanno allo stesso livello diciamo, anche se graficamente non sembra. Nel disegno ho messo 3 figli, è un caso, potrebbe averne 10 o di più. cmq il problema non è l'albero n-ario, come il disegno, con puntatore al figlio e ai fratelli...quello è implementato bene, riesco a fare tutto. Il problema è che devo rappresentare in memoria l'albero binario corrispondente a quello n-ario e stamparli entrambi.
ad esempio, la funzione per visitare l'albero in profondità preordine è questa: Codice:
Visita_Preordine(nodo *T)
{
/*vista T*/
if(T -> figlio != NULL)
Visita-Preordine(T -> figlio);
if(T -> fratello != NULL)
Visita-Preordine(T -> fratello);
}
io pensavo che dovevo ricrearlo in memmoria l'albero binario partendo da quello n-ario..cioè creare un nodo X, fare in modo che stiano allo stesso livello, e fare tutto il resto..ma dite che non c'è bisogno??
__________________
Hp pavilion dv6-1250el [cpu: P8700 - ati radeon hd 4650 1 gb - 4 gb ram - hd 320 7200 rpm!] Garmin Official Thread |
|
|
|
|
|
#7 |
|
Junior Member
Iscritto dal: Nov 2007
Messaggi: 1
|
ueeeeeeeee
ue gepeppe, ci acchiappiamo pure qua, pure io mi stavo documentando un po' su questo fatto, in parte mi trovo su quanto detto, nel senso che un albero n-ario è già un albero binario (ogni nodo ha 2 puntatori), ma viene visto diversamente, noi non dobbiamo fare altro che modificare la lista dei "fratelli" in modo tale che non sia lineare ma diventi anche essa un albero a puntatori (non è difficile perchè ogni elemento è un nodo dello stesso tipo). La cosa da fare è sfruttare il puntatore sx di ogni nodo della lista, visto che all'inizio noi utilizzavamo solo il dx per puntare al fratello. Così facendo trasformeremo la lista in albero inserendo opportunamente dei nodi neutri che contengono un'informazione fittizia e saranno utilizzati solo per diramare l'albero. Cmq oggi chiedo un po' a Lamberti e poi ne parliamo.
Ultima modifica di claxon : 29-11-2007 alle 10:40. |
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Jun 2005
Città: Napoli
Messaggi: 2599
|
ehehe...ttt per LASD
cmq non è chiarissima la spiegazione...
__________________
Hp pavilion dv6-1250el [cpu: P8700 - ati radeon hd 4650 1 gb - 4 gb ram - hd 320 7200 rpm!] Garmin Official Thread Ultima modifica di gepeppe : 30-11-2007 alle 10:29. |
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Jun 2005
Città: Napoli
Messaggi: 2599
|
up
__________________
Hp pavilion dv6-1250el [cpu: P8700 - ati radeon hd 4650 1 gb - 4 gb ram - hd 320 7200 rpm!] Garmin Official Thread |
|
|
|
|
|
#10 |
|
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2782
|
Io sinceramente non ho capito cosa stai chiedendo.. Perchè non fai come ti ha detto Furla?
|
|
|
|
|
|
#11 |
|
Senior Member
Iscritto dal: Feb 2004
Messaggi: 1454
|
è facile accorgersi che per ottenere la visita anticipata dell'albero generico basta fare la visita anticipata dell'albero binario figlio-fratello che lo rappresenta. una visita posticipata dell'albero figlio-fratello corrisponde ad una visita simmetrica dell'albero generico da esso rappresentato. per ottenere la visita posticipata dell'albero generico a partire dalla sua rappresentazione figlio-fratello invece c'è da scrivere una funzione apposta, se ti vuoi divertire
il mio consiglio è di lasciar perdere l'uso di nodi fittizi che sono uno spreco di memoria ed una palla al piede quando vuoi lavorare sulle etichette e/o sui livelli, qualsiasi cosa tu voglia fare con un albero generico la puoi realizzare con una funzione che lavori sulla sua rappresentazione figlio-fratello |
|
|
|
|
|
#12 |
|
Senior Member
Iscritto dal: Jun 2005
Città: Napoli
Messaggi: 2599
|
oltre che stamparlo dovrei crearlo proprio fisicamente l'albero binario. Cmq se io volessi trasformare un albero n-ario in uno binario, non avrei nessun problema, se non dovessi RISPETTARE LE PARENTELE...è semplicicssimo. Io invece devo rispettarle...cioè se un nodo di un albero n-ario ha 3 figlio, nel rispettivo albero binario deve ancora avere 3 figli..ovvero uno che aveva prima, un nodo X, di cui sono figli gli altri due nodi. Ecco rispettata la parentela, non facendo contare il nodo X. forse non riesco a farmi capire io...
Furla ho letto quello che hai scritto, e ti ringrazio per le risposte, ma la vedo troppo complicata come descrizione...non ci ho capito molto
__________________
Hp pavilion dv6-1250el [cpu: P8700 - ati radeon hd 4650 1 gb - 4 gb ram - hd 320 7200 rpm!] Garmin Official Thread |
|
|
|
|
|
#13 |
|
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2782
|
Nella prima immagine di Furla se guardi la parentela è rispettata:
Il nodo 1 ha un figlio con 2 fratelli e quindi un totale di 3 figli Il nodo 2 ha un figlio con 2 fratelli e quindi sempre 3 figli Il nodo 3 ha un figlio. E' un altro discorso se quello che ti è stato richiesto è l'uso di questo nodo X... |
|
|
|
|
|
#14 |
|
Senior Member
Iscritto dal: Feb 2004
Messaggi: 1454
|
scusa, ma se non conservi le parentele non è lo stesso albero! la rappresentazione figlio fratello le conserva eccome, ci mancherebbe altro. il fatto che ogni nodo punti ad un fratello significa, in pratica, avere la lista dei figli di ogni nodo. tant'è che il tuo albero generico di partenza è già memorizzato in forma figlio-fratello.
a meno che non ti sia stato esplicitamente richiesto di usare la rappresentazione che dici tu, che è poco efficiente e scomoda, ti conviene cercare un po' di documentazione sui son-brother che sono molto più semplici da maneggiare, una volta che hai capito come funzionano. se ci dici quali sono le operazioni che devi fare sull'albero ti aiutiamo volentieri a scrivere le funzioni Ultima modifica di Furla : 01-12-2007 alle 13:16. |
|
|
|
|
|
#15 |
|
Senior Member
Iscritto dal: Jun 2005
Città: Napoli
Messaggi: 2599
|
ok...le operazioni sono 3:
la prima è creare un albero n-ario partendo da un file di testo...FATTO (nella forma figlio, fratello con fratello che punta ad una lista di 0 o massimo 10 fratelli] la seconda è stampare l'albero n-ario appena creato (pensavo ad una vistita in preordine) ecco il codice: Codice:
void Visita_Preordine(nodo *T)
{
/*vista T*/
printf("%s\n", T -> info);
if(T -> figlio != NULL)
Visita_Preordine(T -> figlio);
if(T -> fratello != NULL)
Visita_Preordine(T -> fratello);
}
la terza cosa è trasformare l'albero appena creato in binario (e qui casco io ora, ho ho un blocco mentale che non mi permette di capire come implementare la cosa...o non saprei. detta da voi sembra semplice..ma io non ci arrivo proprio!! cmq i nodi X potrei evitarli se riuscissi a rispettare la parentela, ma io la vedo impossibile(se un nodo ha 3 figli, come fa in binario ad averne ancora 3 senza nodo X??)
__________________
Hp pavilion dv6-1250el [cpu: P8700 - ati radeon hd 4650 1 gb - 4 gb ram - hd 320 7200 rpm!] Garmin Official Thread |
|
|
|
|
|
#16 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Guarda che quello che ti ha postato Furla qui è un albero n-ario rappresentato sotto forma di albero binario
http://img530.imageshack.us/my.php?image=abvzm6fw5.jpg Il trucco è proprio nella forma figlio - fratello. Immaginati un albero n-ario memorizzato in quella forma. A questo punto immaginiamoci di chiamare figlio -> figlio1 e fratello -> figlio2. Ti torna che sia un albero binario ? Ultima modifica di cionci : 01-12-2007 alle 18:34. |
|
|
|
|
|
#17 | |
|
Senior Member
Iscritto dal: Jun 2005
Città: Napoli
Messaggi: 2599
|
Quote:
__________________
Hp pavilion dv6-1250el [cpu: P8700 - ati radeon hd 4650 1 gb - 4 gb ram - hd 320 7200 rpm!] Garmin Official Thread |
|
|
|
|
|
|
#18 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
In che senso ? Ogni nodo ha solo due figli
|
|
|
|
|
|
#19 |
|
Senior Member
Iscritto dal: Jun 2005
Città: Napoli
Messaggi: 2599
|
ehehe..ecco il grosso problema. se vedi il mio primo post ho fatto una descrizione (credo chiara) del problema. trasformare un albero n-ario con più di due figli per genitore in un albero binario con due figli per genitore e con un nodo X, quando serve, per far rispettare i gradi di parentela. (padre con 3 figli ==> diventa in binario ==> padre con 1 figlio + 1 figlio "X" che ha gli altri 2 figli e che non da contribbuto ai livelli (il livello dei sui 2 figli ha lo stesso suo livello)...
è proprio un problema...
__________________
Hp pavilion dv6-1250el [cpu: P8700 - ati radeon hd 4650 1 gb - 4 gb ram - hd 320 7200 rpm!] Garmin Official Thread |
|
|
|
|
|
#20 | |
|
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Quote:
a) Durante il run dell'algoritmo di conversione da albero enario a albero binario potresti semplicemente "segnare" in modo opportuno il "figlio X" per poterlo riconoscere e interpretare il fatto che i suoi nodi figlio si trovano al suo stesso livello (e quindi a quello dei fratelli di "figlio X"): ovvero quando lo si "attraversa" per raggiungere un suo figlio non si "incrementa" il livello... b) Se si può, ogni nodo memorizza il livello in cui si trova, così i figli generati da "figlio X" riporterebbero lo stesso valore di livello del padre e quindi dei fratelli del padre, rispettando così la stessa situazione che c'era nell'albero enario di partenza... Es.: albero enario: Codice:
|A|
/ \
|B| |C|
/ | \
|D||E||F|
converito (* == "figlio X"): Codice:
|A|
/ \
|B| |C|
/ \
|D||E|*
/\
|F||-|
La logica che devi definire ed implementare è quella che si occupa, per ogni nodo dell'albero enario in cui sono presenti più di due figli, di prendere i figli maggiori del primo a tre a tre; il primo della terna diventa "figlio X" e il secondo e terzo della terna i suoi figli; il terzo della terna in particolare, diventa a suo volta "figlio X" se ci sono ulteriori terne oltre la prima da inserire. Ho capito bene? Ultima modifica di banryu79 : 02-12-2007 alle 13:41. |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 17:46.
























