Разбор задачи: Максимальная глубина бинарного дерева

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

def max_depth(root):
    """
    Вычисляет максимальную глубину бинарного дерева, представленного в виде вложенных списков.

    :param root: Список, представляющий бинарное дерево.
    :return: Максимальная глубина дерева.
    """
    if not root:
        return 0
    left_depth = max_depth(root[1]) if len(root) > 1 and root[1] else 0
    right_depth = max_depth(root[2]) if len(root) > 2 and root[2] else 0
    return 1 + max(left_depth, right_depth)

1. Описание параметра root

root — это вложенный список, представляющий бинарное дерево, где:

  • Первый элемент списка — значение текущего узла.
  • Второй элемент — левое поддерево (либо None, если поддерева нет).
  • Третий элемент — правое поддерево (либо None, если поддерева нет).

Пример:

root = [1, [2, None, None], [3, None, None]]

Это дерево:

      1
     / \
    2   3

2. Базовый случай

if not root:
    return 0
  • Если переданный узел пустой (root равен None или пустому списку []), дерево не имеет глубины, поэтому возвращается 0.

3. Рекурсивное вычисление глубины левого и правого поддеревьев

left_depth = max_depth(root[1]) if len(root) > 1 and root[1] else 0
right_depth = max_depth(root[2]) if len(root) > 2 and root[2] else 0
  • root[1] — левое поддерево.
    • Если список root содержит второй элемент (проверка len(root) > 1) и этот элемент не равен None, вызывается рекурсивная функция max_depth(root[1]).
    • Если поддерева нет, глубина считается равной 0.
  • root[2] — правое поддерево.
    • Аналогично, если правое поддерево существует, вычисляется его глубина рекурсивно. Если поддерева нет, глубина равна 0.

4. Возврат результата

return 1 + max(left_depth, right_depth)
  • Добавляется 1, чтобы учесть текущий узел.
  • Затем выбирается максимальная глубина между левым (left_depth) и правым (right_depth) поддеревом.

Пример работы функции

Пример 1:

Ввод:

root = [1, [2, None, None], [3, None, None]]
  1. Вызов max_depth([1, [2, None, None], [3, None, None]]):
    • root[1] = [2, None, None] → Рекурсивный вызов max_depth([2, None, None]) возвращает 1.
    • root[2] = [3, None, None] → Рекурсивный вызов max_depth([3, None, None]) возвращает 1.
    • Максимальная глубина: 1 + max(1, 1) = 2.

Пример 2:

Ввод:

root = [1, [2, [4, None, None], [5, None, None]], [3, None, None]]
  1. Вызов max_depth([1, [2, [4, None, None], [5, None, None]], [3, None, None]]):
    • Левое поддерево:
      • root[1] = [2, [4, None, None], [5, None, None]] → Глубина левого поддерева:
        • max_depth([4, None, None]) → возвращает 1.
        • max_depth([5, None, None]) → возвращает 1.
        • Глубина: 1 + max(1, 1) = 2.
    • Правое поддерево:
      • root[2] = [3, None, None] → возвращает 1.
    • Максимальная глубина: 1 + max(2, 1) = 3.

 



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