Как вы можете преобразовать двоичное дерево в бинарное дерево поиска с O (1) дополнительное место?
Binary дерево бинарного дерева поиска (BST)
Преобразование неупорядоченного бинарного дерева в упорядоченном бинарное дерево поиска тривиально, но немного более трудно сделать быстро.
Вот наивная реализация, которая должна удовлетворять ваши критерии, я не буду описывать реальные шаги, чтобы взять, только общий алгоритм.
- Захватите случайный узел листа из существующего дерева
- Unlink узел листа из существующего дерева
- Сделайте узел корень вашего нового бинарного дерева поиска
- Возьмите другой случайный узел листа из существующего дерева
- Unlink этого узла из существующего дерева
- Найдите правильное место для, и связать узел, в новое бинарное дерево поиска
- Повторите шаг 4-6 до исходного дерева пусто
Вы должны требовать лишь несколько переменных, как родительский узла листа вы Отмену связей (если узлы имеют родительскую-ссылку), корневой узел нового дерева, и несколько временных переменные, все в пределах вашего O (1 ) критерии пространства.
Это не будет производить оптимальное бинарное дерево поиска. Для этого вам необходимо либо отсортировать узлы, прежде чем добавлять их, и добавить их в правильном порядке, или использовать балансировку дерево двоичного поиска, как красно-черное дерево или скошенное дерево.
Преобразование двоичного дерева в двусвязном list- можно сделать Inplace в O (N) Тогда разбирайтесь с помощью сортировки слияния, NlogN Преобразовать список обратно в дерево - O (п)
Простой NlogN решение.













