|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Member
Iscritto dal: Jan 2003
Città: Roma
Messaggi: 183
|
[C] Alberi binari maledetti
Dunque ecco qua un albero binario (struttura odiosa davvero) vi pongo subito il problema e vi posto il codice che ho elaborato io, la funzione Preorder che dovrebbe sostituire alla radice la somma dei sottoalberi è sbagliata... Cmq ecco il testo completo...
"Progettare un programma C che legge da stdin un albero binario in preordine e stampa in preordine su sdtout l'albero ottenuto sostituendo l'etichetta di ogni nodo r con la somma delle etichette del sottoalbero con radice r." #include<stdio.h> #include<stdlib.h> struct treenode { struct treenode *leftptr; int data; struct treenode *rightptr; }; typedef struct treenode TreeNode; typedef TreeNode *TreeNodeptr; TreeNodeptr insertnormal(); int PreOrder(TreeNodeptr treeptr); int main() { TreeNodeptr Tree = NULL; Tree = insertnormal(); PreOrder(Tree); } TreeNodeptr insertnormal() { int f,value; TreeNodeptr newPtr = NULL; scanf("%d %d", &f, &value); newPtr = (TreeNode*) malloc(sizeof(TreeNode)); if ((newPtr)== NULL) { return; } else { newPtr->data = value; switch(f) { case 0: newPtr->leftptr = NULL; newPtr->rightptr = NULL; break; case 1: newPtr->leftptr = insertnormal(); newPtr->rightptr = NULL; break; case 2: newPtr->leftptr = insertnormal(); newPtr->rightptr = insertnormal(); break; } return(newPtr); } } int PreOrder(TreeNodeptr treeptr) { TreeNodeptr left = NULL; TreeNodeptr right = NULL; right = treeptr->rightptr; left = treeptr->leftptr; int i = 0; if(treeptr != NULL) { while(left != NULL && right != NULL) { i = PreOrder(left) + PreOrder(right); treeptr-> data = i; printf("%d", treeptr->data); } } } Esempio 1. stdin: 2 0 1 7 0 11 2 9 0 13 0 22 stdout: 2 62 1 18 0 11 2 44 0 13 0 22 Grazie a chiunque mi aiuterà anche con una piccola indicazione. Secondo me è sbagliata la ricorsione però non lo so.. Non lanciate la funzione PreOrder che altrimenti vi da un loop infinito! Ultima modifica di Ancosen : 25-02-2005 alle 17:19. |
|
|
|
|
|
#2 |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
[OT] scusate ma non resisto :D
BWUAHWUHWUAHWA Andrea Cosentino se la sta facendo sotto per l'esame di Programmazione 1 del 28 Feb all'università La Sapienza di Roma!!!
dai scherzo, in bocca al lupo! |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Oct 2002
Città: Roma
Messaggi: 1502
|
io non ho capito com'è rappresentato l'albero in input..qual è il figlio sinistro e quello destro di un nodo?
__________________
Sun Certified Java Programmer EUCIP Core Level Certified European Certification of Informatics Professionals |
|
|
|
|
|
#4 |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
l'albero è da leggere in preordine, quindi il formato è come segue:
Codice:
<etichetta figlio sinistro (se esiste)> <esistenza del figlio sx> <esistenza del figlio dx> <etichetta padre> <etichetta figlio destro (se esiste)> Codice:
come 1 1 ciao stai |
|
|
|
|
|
#5 |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
non vorrei però essermi confuso con l'inorder; in tal caso il formato del preorder sarebbe:
Codice:
<esistenza del figlio sx> <esistenza del figlio dx> <etichetta padre> <etichetta figlio sinistro (se esiste)> <etichetta figlio destro (se esiste)> Codice:
1 1 ciao come stai |
|
|
|
|
|
#6 |
|
Member
Iscritto dal: Jan 2003
Città: Roma
Messaggi: 183
|
71104
Ma ci conosciamo io e te? Almeno di nome? oppure di vista?
|
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Oct 2002
Città: Roma
Messaggi: 1502
|
io ancora non ho capito com'è rappresentato st'albero in input
__________________
Sun Certified Java Programmer EUCIP Core Level Certified European Certification of Informatics Professionals |
|
|
|
|
|
#8 | |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
Re: 71104
Quote:
come sono dispettoso |
|
|
|
|
|
|
#9 |
|
Member
Iscritto dal: Jan 2003
Città: Roma
Messaggi: 183
|
e dai... Stiamo andando un po' OT mi pare...
|
|
|
|
|
|
#10 |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
[OT]
ok, fine dell'OT, sono uno dell'università del 1° anno; ti do un indizio: su TWiki sono famoso...
ora torniamo IT |
|
|
|
|
|
#11 |
|
Member
Iscritto dal: Jan 2003
Città: Roma
Messaggi: 183
|
Ah forse ho capito... Sei quel ragazzo a cui avrebbero dovuto testare l'ultimo homework anche con i negativi?
|
|
|
|
|
|
#12 |
|
Member
Iscritto dal: Jan 2003
Città: Roma
Messaggi: 183
|
Tornando IT l'albero è letto in PreOrder, quindi faccio lo switch dei figli e creo i nodi a seconda del numero dei figli.. Il problema è la seconda parte... Mi sono allenato parecchio e ho fatto un sacco di problemi di vecchi esami del Prof...
|
|
|
|
|
|
#13 |
|
Senior Member
Iscritto dal: Oct 2002
Città: Roma
Messaggi: 1502
|
Se il problema è la seconda parte, cioè aggiornare l'etichetta di un nodo con la somma delle etichette del sottoalbero corrispondente basta fare cosi:
Codice PHP:
aggiorna esegue una visita inorder dell'albero tree; dopo la visita ogni nodo r dell'albero avrà per etichetta la somma delle etichette del sottoalbero radicato in r. aggiorna ritorna l'etichetta aggiornata del nodo radice. Dopo aver usato la funzione aggiorna, ti basta fare una visita in preorder dell'albero per stamparlo
__________________
Sun Certified Java Programmer EUCIP Core Level Certified European Certification of Informatics Professionals |
|
|
|
|
|
#14 | |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
ultimo OT
Quote:
piace anche a me cazzeggiare su HwUpgrade e poi di tanto in tanto si trova anche qualcosa di utile |
|
|
|
|
|
|
#15 | |
|
Bannato
Iscritto dal: Jul 2000
Città: Malo (VI)
Messaggi: 1000
|
Re: [C] Alberi binari maledetti
Quote:
Per ogni nodo tu hai bisogno solo del nuovo valore dei figli (oltre che del valore del nodo stesso), e il risultato serve solo al padre. Tralasciando la stampa del risultato, questo vuol dire che la funzione chiesta dall'esercizio non e' altro che la seguente (codice stile python per brevita'): Codice:
def tree():
"""Leggi il prossimo nodo dalla linea di comando, procedi con
eventuali figli e ritorna la somma totale"""
sons,value = leggi_la_prossima_linea()
for n in range(0,sons):
value = value + tree()
return value
Se fosse richiesto in ordine postfisso, sarebbe molto semplice, basterebbe stampare il risultato non appena calcolato prima di ritornarlo: Codice:
def tree():
"""Leggi il prossimo nodo dalla linea di comando, procedi con
eventuali figli e ritorna la somma totale"""
sons,value = leggi_la_prossima_linea()
for n in range(0,sons):
value = value + tree()
print sons,value
return value
Anche convertito in C, non dovresti andare oltre alle 25-30 linee di codice. Ultima modifica di /\/\@®¢Ø : 26-02-2005 alle 17:45. |
|
|
|
|
|
|
#16 | |
|
Member
Iscritto dal: Jan 2003
Città: Roma
Messaggi: 183
|
Re: ultimo OT
Quote:
Grazie a tutti quelli che mi hanno risposto |
|
|
|
|
|
|
#17 | |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
OTissimo
Quote:
non ci sono parole, è stata una cosa vergognosa; ho anche chiesto al prof se vista la situazione poteva cancellare il mio nome e permettermi di tornare all'appello successivo, ma niente morale della storia sono riuscito a svolgere solo 3 esercizi su 9, però forse non è neanche detto che sia andata tanto male perché il migliore che c'era è riuscito a farne 4 e uno sa che è sbagliato forse un 24 riesco ad accaparrarmelo... cmq ti do una dritta: il tronci dice che all'esame è possibile portarsi dei pezzi di codice fatti a casa; tu fatti TUTTI gli esercizi del 25 e portati quelli, perché i nostri erano estremamente simili se vogliamo continuare la discussione andiamo su TWiki ciao |
|
|
|
|
|
|
#18 |
|
Member
Iscritto dal: Jan 2003
Città: Roma
Messaggi: 183
|
ok per twiki.
|
|
|
|
|
|
#19 |
|
Senior Member
Iscritto dal: Dec 2004
Città: Parma
Messaggi: 1037
|
per fare la somma dei sottoalberi la soluzione più razionale sarebbe un tipo di visita in postorder cmq..
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 23:47.



















