Разбор задачи: Инвертирование двоичного дерева

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

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 выполняет задачу инверсии бинарного дерева. Инверсия подразумевает, что для каждого узла дерева его левое и правое поддеревья меняются местами. Это решение основано на рекурсии.


Алгоритм работы функции

  1. Базовый случай:
    • Если узел root равен None (дерево пустое или достигнут конец ветви), функция возвращает None. Это условие завершает рекурсию.
  2. Инверсия текущего узла:
    • Левое и правое поддеревья текущего узла меняются местами с помощью присваивания:

      root.left, root.right = root.right, root.left
      
  3. Рекурсивный вызов для поддеревьев:
    • После инверсии текущего узла функция рекурсивно вызывает себя для инверсии левого и правого поддеревьев:

      invertTree(root.left)
      invertTree(root.right)
      
  4. Возврат результата:
    • После инверсии всех узлов дерево возвращается через корень root.

Разбор на примере

Исходное дерево:

        4
      /   \
     2     7
    / \   / \
   1   3 6   9

Пошаговая работа алгоритма:

  1. Начало работы:
    • Вызов invertTree(4).
  2. Инверсия корневого узла:
    • Левое поддерево 2 и правое поддерево 7 меняются местами:

             4
           /   \
          7     2
         / \   / \
        6   9 1   3
      
  3. Рекурсивная инверсия поддерева с корнем 7:
    • Вызов invertTree(7):
      • Левое поддерево 6 и правое поддерево 9 меняются местами:

               7
             /   \
            9     6
        
  4. Рекурсивная инверсия поддерева с корнем 2:
    • Вызов invertTree(2):
      • Левое поддерево 1 и правое поддерево 3 меняются местами:

               2
             /   \
            3     1
        
  5. Сборка результирующего дерева:
    • После завершения всех рекурсивных вызовов дерево имеет следующий вид:

             4
           /   \
          7     2
         / \   / \
        9   6 3   1
      

 



Комментарии

xsnm_avatar
xsnm
,
6 месяцев, 8 дней назад

# root =[4,2,7,1,3,6,9]>>>> обход > [4, 2, 1, 3, 7, 6, 9] >>>> invertTree() => обход  =>>>> [4, 7, 9, 6, 2, 3, 1]
# см. Ваш пример обхода.???!!!
 

0

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