Программа курса:
Разбор задачи: Инвертирование двоичного дерева
Предложенный нами код решения:
def invertTree(root: TreeNode) -> TreeNode:
"""
Инвертирует бинарное дерево, меняя местами все его левые и правые дочерние узлы.
:param root: TreeNode, корень бинарного дерева
:return: TreeNode, корень инвертированного дерева
"""
if root is None:
return None
# Рекурсивно инвертируем левые и правые поддеревья
root.left, root.right = root.right, root.left
# Инвертируем поддеревья
invertTree(root.left)
invertTree(root.right)
return rootФункция invertTree выполняет задачу инверсии бинарного дерева. Инверсия подразумевает, что для каждого узла дерева его левое и правое поддеревья меняются местами. Это решение основано на рекурсии.
Алгоритм работы функции
- Базовый случай:
- Если узел
rootравенNone(дерево пустое или достигнут конец ветви), функция возвращаетNone. Это условие завершает рекурсию.
- Если узел
- Инверсия текущего узла:
Левое и правое поддеревья текущего узла меняются местами с помощью присваивания:
root.left, root.right = root.right, root.left
- Рекурсивный вызов для поддеревьев:
После инверсии текущего узла функция рекурсивно вызывает себя для инверсии левого и правого поддеревьев:
invertTree(root.left) invertTree(root.right)
- Возврат результата:
- После инверсии всех узлов дерево возвращается через корень
root.
- После инверсии всех узлов дерево возвращается через корень
Разбор на примере
Исходное дерево:
4
/ \
2 7
/ \ / \
1 3 6 9
Пошаговая работа алгоритма:
- Начало работы:
- Вызов
invertTree(4).
- Вызов
- Инверсия корневого узла:
Левое поддерево
2и правое поддерево7меняются местами:4 / \ 7 2 / \ / \ 6 9 1 3
- Рекурсивная инверсия поддерева с корнем
7:- Вызов
invertTree(7):Левое поддерево
6и правое поддерево9меняются местами:7 / \ 9 6
- Вызов
- Рекурсивная инверсия поддерева с корнем
2:- Вызов
invertTree(2):Левое поддерево
1и правое поддерево3меняются местами:2 / \ 3 1
- Вызов
- Сборка результирующего дерева:
После завершения всех рекурсивных вызовов дерево имеет следующий вид:
4 / \ 7 2 / \ / \ 9 6 3 1
xsnm
,# root =[4,2,7,1,3,6,9]>>>> обход > [4, 2, 1, 3, 7, 6, 9] >>>> invertTree() => обход =>>>> [4, 7, 9, 6, 2, 3, 1]
# см. Ваш пример обхода.???!!!