En CLRS, los autores introducen la operación de rotación en el árbol rojo-negro siguiendo el 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
donde atributo .left, .right, .p correspondiente a su hijo izquierdo, derecho y su padre. T es el árbol.
Mis preguntas principales se encuentran en la línea 3 y la línea 4:
¿Por qué necesito tener la condición if de la línea 3? El libro dice que NIL es en realidad una hoja del árbol rojo-negro, por lo que supongo que NIL también puede tener un puntero principal. Estos códigos aún deberían funcionar sin la Línea 3.
Con la línea 1 y la línea 2, ¿puedo escribir la línea 4 como
x.right.p = x
? Si en realidad son lo mismo, ¿hay alguna razón por la cual el autor eligió escribirloy.left.p = x
?
Mi instinto es que x.right.p = x
es diferente de y.left.p = x
. Sin embargo, no puedo encontrar una buena explicación para esto. He revisado la definición de punteros , pero sigue siendo bastante confuso después de buscar en Google mucho ...