Перенесение узлов в бинарном дереве

Есть бинарное дерево, построенное из отсортированного списка. По условию задачи в дереве происходит смена узлов местами, и вместе с узлами, меняются местами и их потомки.

На вход дается список:

tree = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

Затем из списка строится дерево:

tree

Затем происходит замена узлов 5 и 2 местами, причем замена происходит вместе с потомками узлов, и дерево должно выглядить так:

введите сюда описание изображения

Затем дерево переносится в список, и список должен выглядеть так:

tree = [1, 5, 3, 10, 2, 6, 7, 4, 8, 9]

Каким образом реализовать функцию, которая будет переносить узлы дерева вместе с потомками?


Ответы (2 шт):

Автор решения: SergFSM

решение по ссылке из комментариев конечно интересное, но сразу три рекурсивные функции выглядят сложно, есть способ попроще:

tree = []
q = [root]  # root - корневой узел, в нашем случае - 1
while q:
    for _ in range(len(q)):
        cur = q.pop(0)
        tree.append(cur.value)
        if cur.left: q.append(cur.left)
        if cur.right: q.append(cur.right)

>>> tree # [1, 5, 3, 10, 2, 6, 7, 4, 8, 9]
→ Ссылка
Автор решения: MBo

Проверить, не является ли один из узлов потомком другого. Если да, то сначала отсоединить дерево потомка от его родителя, затем второй узел от его родителя. Если такой зависимости нет, то отсоединять в любом порядке.

Теперь присоединить первый узел на место второго и наоборот.

О существенном: описание дерева по уровням не даёт однозначной информации о его структуре, это прокатывает только для полного бинарного дерева (как на первой картинке, все уровни заполнены, кроме, возможно, последнего)

→ Ссылка