|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Bannato
Iscritto dal: Mar 2004
Città: Roma
Messaggi: 2682
|
[Pseudo Codice]Calcolare l'altezza di un albero (help me)
Ciao,
stò un po' in crisi con un algoritmo trovato sulle dispense del professore per calcolare l'altezza di un albero...non mi torna. L'algoritmo in pseudo codice è questo: Codice:
CalcolaAltezza(nodo r)
IF (r == null) THEN return(-1)
sin = CalcolaAltezza(figlio sinistro di r)
des = CalcolaAltezza(figlio destro di r)
return 1 + max{sin, des}
![]() mi pare che non funzioni.... non riesco a vedere quale sia l'ordine delle chiamate riorsive...mi date una mano? Grazie Andrea |
|
|
|
|
|
#2 |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
nel caso base deve ritornare 0, non -1
|
|
|
|
|
|
#3 | |
|
Senior Member
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12112
|
![]() Quote:
![]() ![]() ![]() ![]()
__________________
|
|
|
|
|
|
|
#4 |
|
Bannato
Iscritto dal: Mar 2004
Città: Roma
Messaggi: 2682
|
|
|
|
|
|
|
#5 |
|
Junior Member
Iscritto dal: Apr 2009
Messaggi: 5
|
Algeritmo ottimo....ma ricorsivo!
Qualcuno di voi sarebbe in grado di scrivere lo stesso algoritmo ma in modo iterativo?? Ho un Albero Binario di Ricerca e devo calcolarne l'altezza obblogatoriamnete in modo iterativo....help me!
Grazie Luca |
|
|
|
|
|
#6 |
|
Junior Member
Iscritto dal: Apr 2009
Messaggi: 5
|
Algoritmo ottimo....ma ricorsivo!
Qualcuno di voi sarebbe in grado di scrivere lo stesso algoritmo ma in modo iterativo?? Ho un Albero Binario di Ricerca e devo calcolarne l'altezza obblogatoriamnete in modo iterativo....help me!
Grazie Luca |
|
|
|
|
|
#7 |
|
Member
Iscritto dal: Aug 2005
Messaggi: 168
|
Allora, l'ordine delle chiamate ricorsive è il seguente:
A B D F D B E B A C A. Nel tuo caso l'algoritmo si sposta a sinistra fino ad arrivare all'ultimo nodo (F). Poi si sposta ancora a sinistra, non c'è nessun nodo e quindi la funzione ritorna -1 e siamo di nuovo in F. Poi si sposta a destra, non esiste nessun nodo e ritorna -1. Ora deve ritornare F. Ritorna 1+max(-1,-1) quindi ritorna 0. Va su D, si sposta a destra, non esiste nessun nodo e quindi ritorna -1. Ora deve ritornare D, che ritornerà 1+max(0,-1) che fà 1. E così via. EDIT: Non avevo visto che era un grave digging -_- |
|
|
|
|
|
#8 | |
|
Bannato
Iscritto dal: Mar 2004
Città: Roma
Messaggi: 2682
|
Quote:
|
|
|
|
|
|
|
#9 | |
|
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
Quote:
Codice:
P è una pila di nodi, P.push(radice), L = 1
finchè P è non vuota
n = P.pop()
L++
se n.dx = null L-- altrimenti L++, P.push(n.dx)
se n.sx = null L-- altrimenti L++, P.push(n.sx)
L è l'altezza
|
|
|
|
|
|
|
#10 |
|
Junior Member
Iscritto dal: Apr 2009
Messaggi: 5
|
Purtroppo non torna
Ho scritto il codice java secondo il tuo esempo, questo è il risultato:
private int gethigh (BinNode<Integer> node){ if(node != null){ int h = 1; Stack<BinNode<Integer>> pila = new Stack<BinNode<Integer>>(); pila.push(node); while(!(pila.isEmpty())){ node = pila.pop(); h++; if(node.left == null) h--; else { h++; pila.push(node.left); } if(node.right == null) h--; else { h++; pila.push(node.right); } } return h; } else return 0; } però per come l'ho scritto io non restituisce il valore giusto... Quancuno sa dove si annida l'errore?!?!?!!?!? |
|
|
|
|
|
#11 |
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Secondo me per farlo iterativamente la cosa più facile è fare una visita per livelli (con una coda) e presupporre che l'albero sia completo:
Codice:
Iterative-Tree-Height(T)
{
Levels = 0
Q = new Queue()
if (T == null)
{
return 0
}
Push(Q, T)
while (not Empty(Q))
{
Count = 0
while (Count < (2 ^ Levels))
{
x = Pop(Q)
if (x == null)
{
Push(Q, null)
Push(Q, null)
}
else
{
Push(Q, x->Left)
Push(Q, x->Right)
}
Count += 1
}
Levels += 1
}
return (Levels + 1)
}
Notte.
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
|
|
|
|
|
#12 | |
|
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
Quote:
Ti conviene dare un'occhiata a qualcosa di più serio se vuoi evitare grandi sorprese all'esame |
|
|
|
|
|
|
#13 |
|
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2780
|
Provo a dare anch'io una mia versione alla "olé"
In pseudocodice: Codice:
int altezza=-1;
Se radice è null ritorna altezza;
Coda c=Coda vuota;
Aggiungi a c la radice;
int nElLivello=1; //numero di elementi del livello corrente che devo visitare
Finché c non è vuota{
Nodo n= estrai da c;
se c.left non è null aggiungilo a c;
se c.right non è null aggiungilo a c;
nElLivello--;
se nElLivello=0{
nElLivello= numero di elementi in c;
altezza++;
}
}
ritorna altezza;
|
|
|
|
|
|
#14 |
|
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
Il mio algorrendo sembra contare una volta di troppo la discesa. Pare che si aggiusti dicendo:
Codice:
P è una pila di nodi, P.push(radice), L = 1
finchè P è non vuota
n = P.pop()
L++
plus = 1;
se n.dx = null L-- altrimenti L += plus, P.push(n.dx), plus = 0
se n.sx = null L-- altrimenti L += plus, P.push(n.sx)
L è l'altezza
|
|
|
|
|
|
#15 |
|
Bannato
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
|
Questa è la mia versione iterativa, in C:
Codice:
int TreeDepth(Tree *head)
{
Tree *temp1, *temp2;
int Conta;
Tree *stack[MAX_STACK];
int top;
top = 0;
Conta = 0;
if ( head == NULL )
{
return -1;
}
temp1 = temp2 = head;
while ( temp1 != NULL )
{
for(; temp1->left != NULL; temp1 = temp1->left)
{
stack[top++] = temp1;
if ( Conta < top )
Conta++;
}
while ( (temp1 != NULL) && (temp1->right == NULL || temp1->right == temp2) )
{
temp2 = temp1;
if ( top == 0 )
return Conta;
temp1 = stack[--top];
}
stack[top++] = temp1;
temp1 = temp1->right;
if ( Conta < top )
Conta = top;
}
return Conta + 1;
}
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 15:12.























