Корректный вывод результат при использовании 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)