Как создать восходящее дерево сплайнов из следующей последовательности
Это последовательность 20,10,5,30,40,57,3,2,4,35,25,18,22,27 Я пробовал сделать каждый новый вставленный узел корневым, но он не работает. Кто-нибудь может дать мне пошаговое объяснение?
1 ответ
Решение
Восходящее расширение начинается с недавно вставленного узла x и выполняет зигзагообразные операции, пока не будет достигнут root. Псевдокод
splay_up(x)
while p(x) != null
if x = c_l(p(x))
if p(p(x)) = null // zig
rotate_right(p(x))
elif p(x) = c_l(p(p(x))) // zig-zig
rotate_right(p(p(x)))
rotate_right(p(x))
elif p(x) = c_r(p(p(x))) // zig-zag
rotate_right(p(x))
rotate_left(p(x))
elif x = c_r(p(x))
if p(p(x)) = null // zig
rotate_left(p(x))
elif p(x) = c_r(p(p(x))) // zig-zig
rotate_left(p(p(x)))
rotate_left(p(x))
elif p(x) = c_l(p(p(x))) zig-zag
rotate_left(p(x))
rotate_right(p(x))
где p(x)
является родителем x, c_l(x)
остается дочерним от x, c_r(x)
является правильным потомком x, повороты деревьев сделаны как обычно.
В вашем случае для первых семи чисел это будет выглядеть так, как на прилагаемой "диаграмме":