Корректный вывод результат при использовании class на Python

Данный код организует обход бинарного дерева в ширину и на выходе выдаёт список элементов этого дерева.

class Node:    

    def __init__(self, L, R, n):
        self.value = n
        self.left = L
        self.right = R

finally_list = []

def height(node):
   
    if not node:
        return 0
    l_height = height(node.left)
    r_height = height(node.right)
    return max(l_height, r_height) + 1


def tree_by_levels(root):

    h = height(root)
    for i in range(h):
        level_tree(root, i)
    return finally_list

def level_tree(root, level):

    if not root:
        return
    if level == 0:
        finally_list.append(root.value)
    elif level > 0:
        level_tree(root.left, level - 1)
        level_tree(root.right, level - 1)

Но на выходе получается что постоянно подтягивается предыдущий результат. Т.е. при вводе следующих данных

print(tree_by_levels((Node(Node(None, Node(None, None, 44), 2), Node(Node(None, None, 5), Node(None, None, 6), 3), 110))))

print(tree_by_levels((Node(Node(None, Node(None, None, 504), 20), Node(Node(None, None, 50), Node(None, None, 60), 30), 2010))))

Получается в результате:

[110, 2, 3, 44, 5, 6]

[110, 2, 3, 44, 5, 6, 2010, 20, 30, 504, 50, 60]

А требуется, что бы код работал постоянно заново, т.е. :

[110, 2, 3, 44, 5, 6]
[2010, 20, 30, 504, 50, 60]

Ответы (1 шт):

Автор решения: Roman Konoval

Вы используете глобальный список finally_list и не очищаете его при запуске tree_by_levels. Из-за этого и случается накопление.

Измените на локальную переменную:

def tree_by_levels(root):
    result = []
    h = height(root)
    for i in range(h):
        level_tree(root, i, result)
    return result

def level_tree(root, level, result):
    if not root:
        return
    if level == 0:
        result.append(root.value)
    elif level > 0:
        level_tree(root.left, level - 1, result)
        level_tree(root.right, level - 1, result)
→ Ссылка