Разбор задачи: Среднее значение уровней в двоичном дереве

Предложенный нами код решения:

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
  1. Инициализация:
    • averages = [], queue = [3]
  2. Уровень 0:
    • level_sum = 3, level_count = 1
    • Добавляем 9 и 20 в next_queue.
    • Среднее: 3 / 1 = 3.00000
    • averages = [3.00000], queue = [9, 20]
  3. Уровень 1:
    • level_sum = 29, level_count = 2
    • Добавляем 15 и 7 в next_queue.
    • Среднее: 29 / 2 = 14.50000
    • averages = [3.00000, 14.50000], queue = [15, 7]
  4. Уровень 2:
    • level_sum = 22, level_count = 2
    • next_queue = []
    • Среднее: 22 / 2 = 11.00000
    • averages = [3.00000, 14.50000, 11.00000]
  5. Конец работы:
    • Очередь пуста (queue = []), возвращаем результат: [3.00000, 14.50000, 11.00000].

 



Вы должны Войти или Зарегистрироваться чтобы оставлять комментарии