CLRSでは、著者は以下の疑似コードによって赤黒ツリーの回転操作を紹介します。
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
ここで、属性.left、.right、.pは、その左、右の子、およびその親に対応します。Tはツリーです。
私の主な質問は3行目と4行目です。
3行目のif条件が必要なのはなぜですか?この本には、NILは実際には赤黒の木の葉であると書かれているので、NILには親ポインターもあると思います。これらのコードはLine 3がなくても機能するはずです。
Line 1とLine 2では、Line 4を次のように書くことができ
x.right.p = x
ますか?それらが実際に同じである場合、著者がそれを次のように書くことを選択した理由はありy.left.p = x
ますか?
私の本能はとx.right.p = x
は異なりy.left.p = x
ます。しかし、これについての良い説明はありません。私はポインタの定義をチェックアウトしましたが、たくさんググった後でそれはまだかなり混乱しています...