No CLRS, os autores introduzem a operação de rotação na árvore vermelho-preto seguindo o pseudocódigo:
LEFT-ROTATE(T, x)
y = x.right # Line 1
x.right = y.left # Line 2
if y.left ≠ T.nil # Line 3
y.left.p = x # Line 4
y.p = x.p
if x.p == T.nil
T.root = y
elseif x == x.p.left
x.p.left = y
else x.p.right = y
y.left = x
x.p = y
em que atributo .left, .right, .p corresponde ao filho esquerdo, direito e pai. T é a árvore.
Minhas principais perguntas estão na Linha 3 e na Linha 4:
Por que preciso ter a condição if da Linha 3? O livro diz que o NIL é na verdade uma folha da árvore vermelho-preta, então suponho que o NIL também possa ter um ponteiro pai. Esses códigos ainda devem funcionar sem a linha 3.
Com a Linha 1 e a Linha 2, posso escrever a Linha 4 como
x.right.p = x
? Se eles são realmente iguais, existe uma razão pela qual o autor escolheu escrevê-lo comoy.left.p = x
?
Meu instinto é que x.right.p = x
é diferente y.left.p = x
. No entanto, não consigo encontrar uma boa explicação para isso. Eu verifiquei a definição de ponteiros , mas ainda é bastante confusa depois que pesquisei bastante no Google ...