この方法でツリーのノードをリンクする簡単な方法を作成しようとしています:
- すべてのリーフは、ツリー内の前および次のリーフにリンクされています
- すべての非リーフは、ツリー内の前および次のリーフにリンクされています
たとえば、次のツリーがあるとします。
A
/ | \
B C D
/ \ / \
E F G H
|
I
これは、メソッドの結果である必要があります。
- B.nextToken = E
- C.prevToken = B
- E.nextToken = F
- E.prevToken = B
- F.nextToken = I
- C.nextToken = I
- H.prevToken = I
メソッドコードは次のとおりです。
prevToken = None
def depthFirstTraverseTokenLinking(tree):
global prevToken
if len(tree.children) == 0:
tree.prevToken = prevToken
if prevToken != None :
prevToken.nextToken = tree # Is something wrong with this line?
prevToken = tree
return
for c in tree.children:
depthFirstTraverseTokenLinking(c)
tree.prevToken = tree.children[0].prevToken
tree.nextToken = tree.children[-1].nextToken
何らかの奇妙な理由で、非リーフは次のリーフにリンクされていません。次に例を示します。
- C.nextToken = なし
それでも
- F.nextToken = I
なぜそれが起こっているのだろうか?再帰関数の最後の行は、親が最後の子と同じ next を持つことを付与する必要があります!