Программа курса:
Разбор задачи: Среднее значение уровней в двоичном дереве
Предложенный нами код решения:
def average_of_levels(root):
"""
:param root: Корень бинарного дерева
:return: Список средних значений на каждом уровне дерева
"""
if not root:
return []
averages = []
queue = [root]
while queue:
level_sum = 0
level_count = len(queue)
next_queue = []
for node in queue:
level_sum += node.val
if node.left:
next_queue.append(node.left)
if node.right:
next_queue.append(node.right)
averages.append(level_sum / level_count)
queue = next_queue
return averagesШаг 1: Проверка пустого дерева
if not root:
return []
Если дерево пустое (root == None), сразу возвращаем пустой список, так как уровней нет.
Шаг 2: Инициализация
averages = []
queue = [root]
averages— список, в который будут записываться средние значения для каждого уровня.queue— очередь для обхода дерева в ширину (BFS). В начале добавляем в неё только корень.
Шаг 3: Цикл по уровням дерева
while queue:
Пока в очереди есть узлы, обрабатываем текущий уровень дерева.
Шаг 4: Подготовка к вычислению среднего для уровня
level_sum = 0
level_count = len(queue)
next_queue = []
level_sum— сумма значений узлов текущего уровня.level_count— количество узлов на текущем уровне (равно длине очередиqueue).next_queue— очередь для хранения узлов следующего уровня.
Шаг 5: Обработка каждого узла уровня
for node in queue:
level_sum += node.val
if node.left:
next_queue.append(node.left)
if node.right:
next_queue.append(node.right)
- Для каждого узла:
- Увеличиваем сумму текущего уровня на значение узла.
- Если у узла есть левый потомок, добавляем его в
next_queue. - Если есть правый потомок, добавляем его в
next_queue.
Шаг 6: Вычисление среднего и переход на следующий уровень
averages.append(level_sum / level_count)
queue = next_queue
- Вычисляем среднее для текущего уровня и добавляем его в
averages. - Переходим к следующему уровню, заменяя
queueнаnext_queue.
Шаг 7: Возврат результата
return averages
Возвращаем список средних значений для каждого уровня.
Пример работы на входных данных
Дерево:
3
/ \
9 20
/ \
15 7
- Инициализация:
averages = [],queue = [3]
- Уровень 0:
level_sum = 3,level_count = 1- Добавляем
9и20вnext_queue. - Среднее:
3 / 1 = 3.00000 averages = [3.00000],queue = [9, 20]
- Уровень 1:
level_sum = 29,level_count = 2- Добавляем
15и7вnext_queue. - Среднее:
29 / 2 = 14.50000 averages = [3.00000, 14.50000],queue = [15, 7]
- Уровень 2:
level_sum = 22,level_count = 2next_queue = []- Среднее:
22 / 2 = 11.00000 averages = [3.00000, 14.50000, 11.00000]
- Конец работы:
- Очередь пуста (
queue = []), возвращаем результат:[3.00000, 14.50000, 11.00000].
- Очередь пуста (
Вы должны Войти или Зарегистрироваться чтобы оставлять комментарии