Последующий обход n-арного дерева

#python #iteration

#python #итерация

Вопрос:

Мне нужна помощь со следующим кодом для ответа. Я пытаюсь выполнить последующий обход n-арного дерева, используя стеки вместо рекурсии, потому что python имеет ограничение в 1000 рекурсий. Я нашел код для обхода предварительного заказа для того же «https://www.geeksforgeeks.org/iterative-preorder-traversal-of-a-n-ary-tree /«о вундеркиндах для вундеркиндов. Но я не могу скрыть его в postorder. Любая помощь будет большой.

Ответ №1:

Вот 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 summary для алгоритма, подобного приведенному выше, в моем github.
Посмотрите это, если вас интересует: https://github.com/recnac-itna/Code_Templates

Комментарии:

1. Спасибо, брат, за вашу поддержку. Но я предполагаю, что приведенный выше код предназначен для двоичного дерева, а не для N-арного дерева.

2. извините, я изменю это. идея знакома.

3. обновите до N-арного дерева и пройдите тест, пожалуйста, проверьте еще раз 🙂 @Scorpion