Spróbuj tego:
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)
Zwraca słownika, gdzie korzeń można uzyskać dostęp za pomocą klawisza ''. Następnie można wykonać prosty plik BFS, aby wydrukować dane wyjściowe.
WYJŚCIE:
{
'' : ['Root'],
'AB' : ['ABC', 'CBA'],
'Root': ['AB', 'CD'],
'CD' : ['CDE', 'FGH']
}
Trzeba będzie wyeliminować wszystkie spacje w wyrażeniu przed rozpoczęciem lub ignorować charaters inrrelevant w ekspresji poprzez dodanie następujących jako pierwszy wiersz w za -lub:
if char == <IRRELEVANT CHARACTER>:
continue
Powyższy kod będzie działać w czasie O (n), gdzie n jest długością wyrażenia.
EDIT
Tutaj funkcja druku:
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)
pożądany wynik można osiągnąć za pomocą następujących:
expression = "(Root(AB(ABC)(CBA))(CD(CDE)(FGH)))"
tree = toTree(expression)
printTree(tree, tree[''][0])
wyjścia
Root -> AB CD
AB -> ABC CBA
CD -> CDE FGH
EDIT
Zakładając nazwy węzłów nie są wyjątkowe, po prostu trzeba dać nowych nazw węzłów. Można to zrobić za pomocą:
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
Funkcja druku będzie teraz zmienić:
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)
Wyjście może być pobrany za pomocą:
expression = " (Root(SQ (VBZ) (NP (DT) (NN)) (VP (VB) (NP (NN)))))"
expression, nodeMap = parseExpression(expression)
tree = toTree(expression)
printTree(tree, tree[''][0], nodeMap)
wyjściowy:
Root -> SQ
SQ -> VBZ NP VP
NP -> DT NN
VP -> VB NP
NP -> NN
Reprezentacja, której używasz, opiera się na S-Expression Lispa s, które mogą pomóc w prowadzeniu Googling, jeśli nic innego .. –
Wskazówka: Główną strukturą danych, której będziesz używać, jest stos, którego najwyższym elementem jest węzeł, do którego dodajesz dzieci. –