Prova questo:
def toTree(expression):
tree = dict()
msg =""
stack = list()
for char in expression:
if(char == '('):
stack.append(msg)
msg = ""
elif char == ')':
parent = stack.pop()
if parent not in tree:
tree[parent] = list()
tree[parent].append(msg)
msg = parent
else:
msg += char
return tree
expression = "(Root(AB(ABC)(CBA))(CD(CDE)(FGH)))"
print toTree(expression)
restituisce un dizionario, dove la radice si può accedere con il tasto ''. È quindi possibile eseguire un semplice BFS per stampare l'output.
USCITA:
{
'' : ['Root'],
'AB' : ['ABC', 'CBA'],
'Root': ['AB', 'CD'],
'CD' : ['CDE', 'FGH']
}
Si dovrà eliminare tutti gli spazi bianchi nell'espressione prima di iniziare, o ignorare le charaters inrrelevant nell'espressione aggiungendo quanto segue come la prima linea nella per -loop:
if char == <IRRELEVANT CHARACTER>:
continue
il codice precedente verrà eseguito in tempo O (n), dove n è la lunghezza dell'espressione.
EDIT
Ecco la funzione di stampa:
def printTree(tree, node):
if node not in tree:
return
print '%s -> %s' % (node, ' '.join(child for child in tree[node]))
for child in tree[node]:
printTree(tree, child)
L'uscita desiderata può essere ottenuta dalla seguente:
expression = "(Root(AB(ABC)(CBA))(CD(CDE)(FGH)))"
tree = toTree(expression)
printTree(tree, tree[''][0])
uscita
Root -> AB CD
AB -> ABC CBA
CD -> CDE FGH
EDIT
Supponendo che i nomi dei nodi non sono unici, non ci resta che dare nuovi nomi ai nodi. Questo può essere fatto utilizzando:
def parseExpression(expression):
nodeMap = dict()
counter = 1
node = ""
retExp =""
for char in expression:
if char == '(' or char == ')' :
if (len(node) > 0):
nodeMap[str(counter)] = node;
retExp += str(counter)
counter +=1
retExp += char
node =""
elif char == ' ': continue
else :
node += char
return retExp,nodeMap
la funzione di stampa ora cambierà in:
def printTree(tree, node, nodeMap):
if node not in tree:
return
print '%s -> %s' % (nodeMap[node], ' '.join(nodeMap[child] for child in tree[node]))
for child in tree[node]:
printTree(tree, child, nodeMap)
L'uscita può essere ottenuto utilizzando:
expression = " (Root(SQ (VBZ) (NP (DT) (NN)) (VP (VB) (NP (NN)))))"
expression, nodeMap = parseExpression(expression)
tree = toTree(expression)
printTree(tree, tree[''][0], nodeMap)
uscita:
Root -> SQ
SQ -> VBZ NP VP
NP -> DT NN
VP -> VB NP
NP -> NN
La rappresentazione che stai utilizzando è basata su S-Expression di Lisp s, che può aiutare il tuo Google, se non altro .. –
Suggerimento: la struttura dati principale che utilizzerai è una pila, l'elemento più in alto è il nodo a cui aggiungi i bambini. –