Trong CLRS, các tác giả giới thiệu hoạt động xoay vòng trong cây đỏ đen bằng cách làm mã giả sau:
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
trong đó thuộc tính .left, .right, .p tương ứng với con trái, con phải và cha mẹ của nó. T là cây.
Câu hỏi chính của tôi nằm ở Dòng 3 và Dòng 4:
Tại sao tôi cần phải có điều kiện if của Line 3? Cuốn sách nói rằng NIL thực sự là một chiếc lá của cây đỏ đen, vì vậy tôi cho rằng NIL cũng có thể có con trỏ cha. Các mã này vẫn hoạt động mà không có Dòng 3.
Với Dòng 1 và Dòng 2, tôi có thể viết Dòng 4 là
x.right.p = x
không? Nếu chúng thực sự giống nhau, có lý do nào mà tác giả chọn viết nóy.left.p = x
không?
Bản năng của tôi x.right.p = x
là khác với y.left.p = x
. Tuy nhiên, tôi không thể tìm thấy một lời giải thích tốt cho việc này. Tôi đã kiểm tra định nghĩa của con trỏ , nhưng nó vẫn còn khá khó hiểu sau khi tôi đã googled rất nhiều ...