|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Dec 2001
Città: Partinico(PA)-Torino
Messaggi: 2885
|
Date un occhiatina a questa semplice funzione...
Salve ragazzi ho implementato questa funzione per determinare la profondità di un albero binario, il codice è pascal:function
function profondita_albero(p: nodo): integer; begin if p <> NIL then if (p^.sx <> NIL) or (p^.dx <> NIL) then profondita_albero:=max(profondita_albero(p^.sx), profondita_albero(p^.dx))+1; end; cos'ha che non va visto che mi da risultati assurdi?Grazie PS: se tolgo il controllo sull'albero dx e sx e lascio solo p <> NIL funziona ma mi dà la profondità maggiorata di 1...
__________________
Main: Barton 2500@3200+ Asus A7N8X-dlx 2*512 DDRPowercolor 9800Pro Maxtor 80GB sATA + Seagate 160GB pATA LCD Acer AL1721 Epson C62 Antec T.P. 430w Tin.it ADSL Muletto: Pentium4 1800 Notebook: Idea Progress P4 Auto e moto d'epoca
|
|
|
|
|
|
#2 |
|
Bannato
Iscritto dal: Jul 2000
Città: Malo (VI)
Messaggi: 1000
|
Re: Date un occhiatina a questa semplice funzione...
Il primo consiglio che ti do e' quello di scrivere il codice tra
Codice:
e Il secondo e' di controllare cosa restituire quando p = NIL, fatto questo puoi tranquillamente togliere il secondo controllo. |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Feb 2003
Città: Lucca
Messaggi: 294
|
prova con questo...che è molto simile
Codice:
if p<>nil then
profondita_albero:=max(profondita_albero(p^.sx), profondita_albero(p^.dx))+1;
else
profondita_albero:=0;
Ciao ciao
__________________
very very cool very very coooool |
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Re: Date un occhiatina a questa semplice funzione...
Codice:
function profondita_albero(p: nodo): integer;
begin
if p <> NIL then
if (p^.sx <> NIL) or (p^.dx <> NIL) then
profondita_albero:=max(profondita_albero(p^.sx), profondita_albero(p^.dx))+1;
end;
Il codice postato da fabio309 va benissimo... Fare una funzione ricorsiva è molto simile a fare una dimostrazione per induzione... Prima metti la condizione di arresto (quando la ricorsione deve terminare)... Poi ti immagini di essere ad un nodo generico della tua struttura e scrivi il codice relativo a come devi comportarti in quel caso (senza fare supposizioni sulla forma della struttura)... E dopo la funzione viene da sè... |
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Dec 2001
Città: Partinico(PA)-Torino
Messaggi: 2885
|
Dunque il problema non è che la procedura non funziona(la condizione d'arresto è "if p<>NIL", aggiungendo il ramo else ovviamente ci assicuriamo che passando un albero vuoto la procedura ritorni 0 com'è giusto che sia...
Forse mi spiego meglio con una figura: guardate l'albero allegato...la procedura, passata la radice di tale albero dovrebbe restituirmi una profondità pari a 2, invece restituisce 3, per questo avevo aggiunto la condizione if (p^.sx <> NIL) or (p^.dx <> NIL) in modo tale che venga richiamata solo quando il nodo ha almeno un figlio...ma non vuole saperne di funzionare e dà risultati sballati...
__________________
Main: Barton 2500@3200+ Asus A7N8X-dlx 2*512 DDRPowercolor 9800Pro Maxtor 80GB sATA + Seagate 160GB pATA LCD Acer AL1721 Epson C62 Antec T.P. 430w Tin.it ADSL Muletto: Pentium4 1800 Notebook: Idea Progress P4 Auto e moto d'epoca
|
|
|
|
|
|
#6 | |
|
Bannato
Iscritto dal: Jul 2000
Città: Malo (VI)
Messaggi: 1000
|
Quote:
Se ho un puntatore a NIL non ho un albero di altezza zero ! L'albero di altezza zero ce l'ho quando ho un solo nodo (una foglia). La soluzione e' quindi ritornare -1 quando ho un puntatore nullo (in quel modo le foglie ritornano max(-1,-1) + 1 ovvero 0 ) |
|
|
|
|
|
|
#7 | |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Quote:
|
|
|
|
|
|
|
#8 | |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Quote:
|
|
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Apr 2003
Messaggi: 16462
|
Secondo me una soluzione potrebbe essere :
Codice:
function profondita_albero(p:^nodo):integer; begin if p==NIL then profondita_albero:= -1 else profondita_albero:=max(profondita_albero(p^.sx),profondita_albero(p^.dx))+1; end |
|
|
|
|
|
#10 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Certo...tra l'altro è la stessa proposta da fabio309...tranne che per il -1...
|
|
|
|
|
|
#11 | |
|
Senior Member
Iscritto dal: Dec 2001
Città: Partinico(PA)-Torino
Messaggi: 2885
|
Quote:
Grazie a tutti per essere sempre disponibili
__________________
Main: Barton 2500@3200+ Asus A7N8X-dlx 2*512 DDRPowercolor 9800Pro Maxtor 80GB sATA + Seagate 160GB pATA LCD Acer AL1721 Epson C62 Antec T.P. 430w Tin.it ADSL Muletto: Pentium4 1800 Notebook: Idea Progress P4 Auto e moto d'epoca
|
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 22:05.










Main: Barton 2500@3200+ Asus A7N8X-dlx 2*512 DDRPowercolor 9800Pro Maxtor 80GB sATA + Seagate 160GB pATA LCD Acer AL1721 Epson C62 Antec T.P. 430w Tin.it ADSL Muletto: Pentium4 1800 Notebook: Idea Progress P4 








