Дайте мне посмотреть, понимаю ли я проблему. Давайте рассмотрим пример с несколькими элементами:
Это заказ, который вы хотите?
ABCDEFGHIJKLMNOPQ
A Q
I
E M
C G K O
B D F H J L N P
Это кажется простым. Создайте структуру данных с именем «Interval», которая имеет два поля: «Величайшая нижняя граница» и «Наименьшая верхняя граница». То есть, каковы элементы, которые являются самой большой вещью, которая находится ниже интервала , и самой маленькой вещью, которая находится над интервалом . Алгоритм выглядит так:
Input: the size of the array.
Yield the first item -- if there is one
Yield the last item -- if it is different from the first item.
Make a queue of intervals.
Enqueue the interval (0, array.Length - 1)
While the queue is not empty:
Dequeue the queue to obtain the current item.
Is the interval empty? If so, skip this interval
Otherwise, the interval has a GLB, a LUB, and a value in the middle.
Yield the middle of the interval
Enqueue the interval (bottom, middle)
Enqueue the interval (middle, top)
Давайте поработаем над примером выше. У нас есть массив ABCDEFGHIJKLMNOPQ
.
Yield A
Yield Q
Enqueue A-Q. The queue is now A-Q
Is the queue empty? No.
Dequeue the queue. It is now empty.
current is A-Q
Is the current interval empty? no.
The middle is I.
Yield I.
Enqueue A-I. The queue is now A-I.
Enqueue I-Q. The queue is now A-I, I-Q.
Is the queue empty? No.
Dequeue the queue. It is now I-Q.
current is A-I.
Is the current interval empty? No.
The middle is E.
Yield E.
Enqueue A-E. The queue is now I-Q, A-E.
Enqueue E-I. The queue is now I-Q, A-E, E-I
Is the queue empty? No.
Dequeue. The queue is now A-E, E-I
current is I-Q
The middle is M
Yield M.
Enqueue I-M
Enqueue M-Q. The queue is now A-E, E-I, I-M, M-Q
OK, let's start skipping some steps here. The state of the queue and the yields are:
Yield C
E-I, I-M, M-Q, A-C, C-E
Yield G
I-M, M-Q, A-C, C-E, E-G, G-I
Yield K
M-Q, A-C, C-E, E-G, G-I, I-K, K-M
yield O
A-C, C-E, E-G, G-I, I-K, K-M, M-O, O-Q
yield B
C-E, E-G, G-I, I-K, K-M, M-O, O-Q, A-B, B-C
OK, skip more steps...
Yield D, F, H, J, L, N, P
Queue is now A-B, B-C, C-D, D-E, ... P-Q
Every interval is now empty, so we skip all of htem and we are done.
Имеет смысл?
Хитрость в том, чтобы заметить, что вы хотите получить посещение дерева в ширину . Вы просто должны иметь возможность «видеть» массив до древовидной структуры, которую вы хотите пройти.
Кстати, порядок кажется немного странным. Похоже, что упорядочение по большей части состоит в том, чтобы «разделить диапазон на две части и сначала получить середину каждого диапазона». Почему тогда две крайности дают сначала , а не последний ? Я бы нашел заказ:
ABCDEFGHIJKLMNOPQ
I
E M
C G K O
B D F H J L N P
A Q
более интуитивно очевидно; если вещи «посередине» всегда имеют приоритет над вещами «на крайностях», то крайности должны идти последними, а не первыми.