Мне нужна помощь со следующим кодом, чтобы ответить. Я пытаюсь выполнить обратный обход n-арного дерева, используя стеки вместо рекурсии, потому что у python есть ограничение в 1000 рекурсий. Я нашел код обхода предзаказа для того же "https://www.geeksforgeeks.org/iterative-preorder-traversal-of-a-n-ary-tree/" на гиков для гиков. Но я не могу скрыть это на постзаказ. Любая помощь будет отличной.
Вот версия iteration
с stack
, которую я использовал:
class TreeNode:
def __init__(self, x):
self.val = x
self.children = []
def postorder_traversal_iteratively(root: 'TreeNode'):
if not root:
return []
stack = [root]
# used to record whether one child has been visited
last = None
while stack:
root = stack[-1]
# if current node has no children, or one child has been visited, then process and pop it
if not root.children or last and (last in root.children):
'''
add current node logic here
'''
print(root.val, ' ', end='')
stack.pop()
last = root
# if not, push children in stack
else:
# push in reverse because of FILO, if you care about that
for child in root.children[::-1]:
stack.append(child)
тестовый код и вывод:
n1 = TreeNode(1)
n2 = TreeNode(2)
n3 = TreeNode(3)
n4 = TreeNode(4)
n5 = TreeNode(5)
n6 = TreeNode(6)
n7 = TreeNode(7)
n8 = TreeNode(8)
n9 = TreeNode(9)
n10 = TreeNode(10)
n11 = TreeNode(11)
n12 = TreeNode(12)
n13 = TreeNode(13)
n1.children = [n2, n3, n4]
n2.children = [n5, n6]
n4.children = [n7, n8, n9]
n5.children = [n10]
n6.children = [n11, n12, n13]
postorder_traversal_iteratively(n1)
визуальное n-арное дерево и вывод:
1
/ | \
/ | \
2 3 4
/ \ / | \
5 6 7 8 9
/ / | \
10 11 12 13
# output: 10 5 11 12 13 6 2 3 7 8 9 4 1
и еще одна идея сделать обратный заказ - изменить результат, например, вставить результат в заголовок.
он менее эффективен, но его легко кодировать. вы можете найти версию в здесь
У меня есть резюме code templates
для алгоритма, как указано выше, в моем github.
Смотрите, если вам интересно:
https://github.com/recnac-itna/Code_Templates
извини, поменяю. идея знакомая.
обновите N-арное дерево и пройдите тест, проверьте еще раз :) @Scorpion
Спасибо братан за поддержку. Но я предполагаю, что приведенный выше код предназначен для двоичного дерева, а не для N-арного дерева.