Я пытаюсь написать простой способ связать узлы дерева вместе таким образом:Странного поведения в коде Python
- Каждого лист связан с предыдущим и следующим листом в дереве
- Каждый не-лист связан с предыдущим и следующим листом в дереве
Например, если у нас есть это дерево:
A
/| \
B C D
/\/\
E F G H
|
I
Это должно быть результатом метода:
- B.nextToken = Е
- C.prevToken = В
- E.nextToken = F
- E.prevToken = В
- Р .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
Интересно, почему это происходит? Последние строки в конце рекурсивной функции должны предоставить получателю, что у родителя будет тот же самый следующий, что и его последний ребенок!
Есть ли причина, по которой вы не используете стек для возврата? –
@Joel Просто для того, чтобы сделать код более читаемым. – Betamoo
Как ключевое слово «global» ведет себя в рекурсии? – Betamoo