<p>问题是,当您访问C时,只遍历它的子对象E&F</p>
<p>“I”还没有被访问,所以<code>C.children[-1].nextToken == None</code>因为只有访问“I”才会设置<code>F.nextToken</code></p>
<p>解决方案:您必须首先在所有叶上运行,然后在内部节点上运行第二次。你知道吗</p>
<p>例如:</p>
<pre><code>prevToken = None
def depthFirstTraverseTokenLinking(tree):
depthFirstTraverseTokenLinkingPhase1(tree)
depthFirstTraverseTokenLinkingPhase2(tree)
def depthFirstTraverseTokenLinkingPhase1(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:
depthFirstTraverseTokenLinkingPhase1(c)
def depthFirstTraverseTokenLinkingPhase2(tree):
if len(tree.children) == 0:
return
for c in tree.children:
depthFirstTraverseTokenLinkingPhase2(c)
if tree.children[0].prevToken is not None:
tree.prevToken = tree.children[0].prevToken
else:
tree.prevToken = tree.children[0]
if tree.children[-1].nextToken is not None:
tree.nextToken = tree.children[-1].nextToken
else:
tree.nextToken = tree.children[-1]
</code></pre>
<p>还要注意内部节点的<code>prevToken</code>/<code>nextToken</code>的变化。如果您希望它们链接到实际的第一个/最后一个叶,则需要这样做。你知道吗</p>