Преобразование BST в дерево симметричной структуры

(Я видел очень похожие упражнения, но все они для обычных бинарных деревьев). Как и в заголовке, я должен предложить алгоритм преобразования BST в другой BST с симметричной структурой, который включает в себя те же значения, что и предыдущий. Например

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

Моя идея состояла в том, чтобы построить новое дерево с самого начала. Я бы начал с нового корня, который находился бы в симметричном положении исходного в отсортированном массиве значений из исходного дерева. В приведенном выше примере: 3 5 6 7 12 число 7 будет новым корнем, потому что количество узлов слева/справа поменялось местами по сравнению с предыдущим корнем 5. Но это не решает проблему полностью, потому что новое дерево зависит от порядка вставки. Я хотел закончить его выполнением вращений в зависимости от баланса. Мой вопрос: должно ли это дерево быть деревом AVL, чтобы я мог выполнять вращения (это означало бы, что в упражнении есть ошибка). Или есть более простой способ решить эту проблему?


person Eno_    schedule 03.09.2018    source источник


Ответы (1)


Я бы решил эту проблему в два этапа:

  1. Поменяйте местами левый и правый дочерние указатели в каждом узле. Это отразит дерево слева направо, изменив порядок всех значений.
  2. Выполните прямой обход по порядку с начала и обратный обход по порядку с конца. Продолжайте шаг блокировки, меняя местами значения между прямой и обратной позициями, пока они не встретятся. Это вернет порядок значений к их исходному порядку, сохранив при этом новую древовидную структуру.
person Matt Timmermans    schedule 04.09.2018