Нам задан массив из 2 m - 1 отдельных сопоставимых элементов, индексированных начиная с 1.
Мы можем рассматривать массив как полное двоичное дерево:
Node is placed at index i.
Left child is placed at 2i.
Right child is placed at 2i+1.
Например, массив
[7 6 4 5 2 3 1]
- дерево
7
/ \
6 4
/ \ / \
5 2 3 1
Теперь, когда они рассматриваются как двоичное дерево, эти элементы удовлетворяют свойству кучи, a node больше, чем его дети:
A[i] > A[2i] and A[i] > A[2i+1]
Есть ли достаточно быстрый алгоритм на месте, чтобы перетасовать элементы массива вокруг так, чтобы получившееся двоичное дерево (как описано выше) было двоичным деревом поиска?
Напомним, что в двоичном дереве поиска a node больше всех его левых потомков и меньше всех его правых потомков.
Например, перестановки вышеупомянутого массива будут
[4 2 6 1 3 5 7]
который соответствует дереву двоичного поиска
4
/ \
2 6
/ \ / \
1 3 5 7