これを試してみてください:
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)
それはルートがキー '' にアクセスすることができ辞書を返します。次に、簡単なBFSを実行して出力を印刷することができます。
OUTPUT:
{
'' : ['Root'],
'AB' : ['ABC', 'CBA'],
'Root': ['AB', 'CD'],
'CD' : ['CDE', 'FGH']
}
あなたが開始する前に、式中のすべての空白を排除する必要がある、またはのために非常に最初の行として次を追加することによって、式のinrrelevantのcharatersを無視します-loop:
if char == <IRRELEVANT CHARACTER>:
continue
上記のコードは、O(n)時間(nは式の長さ)で実行されます。ここ
EDIT
は、印刷機能である:
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)
所望の出力は、以下により達成することができる。
expression = "(Root(AB(ABC)(CBA))(CD(CDE)(FGH)))"
tree = toTree(expression)
printTree(tree, tree[''][0])
出力
ノード名を想定し
EDIT
は一意ではありません、私たちはただのノードに新しい名前を与える必要があります。これは、使用して行うことができます。
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
印刷機能は、今に変更されます:
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)
出力を使用することによって得ることができる。
expression = " (Root(SQ (VBZ) (NP (DT) (NN)) (VP (VB) (NP (NN)))))"
expression, nodeMap = parseExpression(expression)
tree = toTree(expression)
printTree(tree, tree[''][0], nodeMap)
出力:
Root -> SQ
SQ -> VBZ NP VP
NP -> DT NN
VP -> VB NP
NP -> NN
使用している表現はLispのS-Expressionに基づいていますあなたのグーグルリングに役立つかもしれません。 –
ヒント:使用する主なデータ構造はスタックです。一番上のアイテムは、子を追加するノードです。 –