PDA

View Full Version : [Python] Salvare e rigenerare Alberi


Heretic Curse
18-06-2013, 20:39
Sono all''ultimo esercizio di Pensare in Python, e non da pochi giorni, siccome mi sa che mi sono impelagato seguendo la strada non esattamente più consigliabile, che tuttavia non riesco a capire perché non funzioni.
Ho questo tipo di TDA:
class Albero:
def __init__(self, Contenuto = None, Sinistra = None, Destra = None):
self.Contenuto = Contenuto
self.Sinistra = Sinistra
self.Destra = Destra

def __str__(self):
return str(self.Contenuto)

Devo poter salvare questi Alberi su un file:
def SalvaAlbero(Albero, Livello = 0):
if Albero == None: return
SalvaAlbero(Albero.Destra, Livello+1)
if Albero.Destra == None and Albero.Sinistra != None:
f.write(' '*Livello + ' ' + "\n")
if Albero.Destra != None and Albero.Sinistra == None:
f.write(' '*Livello + ' ' + "\n")
else:
f.write(' '*Livello + str(Albero.Contenuto))
if "\n" not in Albero.Contenuto:
f.write("\n")
SalvaAlbero(Albero.Sinistra, Livello+1)

E infine, e qui viene la parte dove ho compiuto un errore che ancora non ho individuato, partendo da un file testo devo poter ricreare un Albero:
def Componi():
file = f.readlines()
i = 0
while i < len(file):
stringa = file[i]
if stringa[0] != " ":
stringa = stringa[0:len(stringa)-1]
Radice = Albero(stringa)
del file[i]
else:
i += 1
Scorri(Radice, file, Spazio = " ")
return Radice

def Scorri(Radice, file, Spazio = " "):
if Radice == None: return
i = 0
while i < len(file):
if Spazio in file[i] and Spazio + " " not in file[i]:
stringa = file[i]
if Spazio == stringa[0:len(Spazio)]:
stringa = stringa[0:len(stringa)-1]
stringa = stringa[0:len(Spazio)].replace(" ", "") + stringa[len(Spazio):len(stringa)]
Radice.Destra = Albero(stringa)
del file[i]
break
else:
continue
if file[i] == Spazio + " ":
Radice.Destra = None
break
else:
i += 1
i = 0
while i < len(file):
if Spazio in file[i] and Spazio + " " not in file[i]:
stringa = file[i]
if Spazio == stringa[0:len(Spazio)]:
stringa = stringa[0:len(stringa)-1]
stringa = stringa[0:len(Spazio)].replace(" ", "") + stringa[len(Spazio):len(stringa)]
Radice.Sinistra = Albero(stringa)
del file[i]
break
else:
continue
if file[i] == Spazio + " ":
Radice.Sinistra = None
break
else:
i += 1
Scorri(Radice.Destra, file, Spazio + " ")
Scorri(Radice.Sinistra, file, Spazio + " ")

f = open("/home/meurem/Scrivania/SaveTree", "w")
Radice = Albero("a", Albero("b", Albero("3", Albero("7"), Albero("9"))), Albero("c", Albero("4", Albero("8")), Albero("6", Albero("12"), Albero("14"))))
SalvaAlbero(Radice)
f.close()
f = open("/home/meurem/Scrivania/SaveTree", "r")
Tree = Componi()
print Tree #a
print Tree.Sinistra #b
print Tree.Destra #c
print Tree.Sinistra.Sinistra #3
print Tree.Sinistra.Destra #None
print Tree.Sinistra.Sinistra.Sinistra #7
print Tree.Sinistra.Sinistra.Destra #9
print Tree.Destra.Destra #6
print Tree.Destra.Destra.Destra # 14
print Tree.Destra.Destra.Sinistra #12
print Tree.Destra.Sinistra #4
print Tree.Destra.Sinistra.Sinistra #8
print Tree.Destra.Sinistra.Destra #None

Al di là del fatto che ho scritto il tutto in modo un po' antiestetico, non riesco a capire come mai non tutti i print restituiscono il corretto valore (che per praticità ho anche scritto come commento a lato):

a
b
c
3

None
None
6
14
12
4
8

[Finished in 0.0s]

So che è un po' lunghetto, ma spero riusciate ad aiutarmi perché le ho provate tutte D: Seguendo il programma passo passo, segnandomi ogni variazione di variabile su di un foglio, sembra che il tutto funzioni correttamente, e invece l'IDE mi sfasa alcuni risultati. Chiaramente l'errore è nei miei ragionamenti, non sto dicendo che sia nell'IDE. Ci sono per qualsiasi delucidazioni, visto che forse in certi punti il mio codice potrebbe apparire un po' strano.

Heretic Curse
19-06-2013, 19:06
UP