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