Программа курса:
Разбор задачи: Максимальная глубина бинарного дерева
Предложенный нами код решения:
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 32. Базовый случай
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 0root[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]]- Вызов
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]]- Вызов
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.
- Левое поддерево:
Вы должны Войти или Зарегистрироваться чтобы оставлять комментарии