赤黒木挿入の修正について、本は6つのケースを区別し、そのうち3つは対称的です。ケースは次のとおりです(zは挿入されるノードです):
ケース2はケース3のサブセットです。左回転でケース2を3に変換できるからです。
しかし、あなたが見ることができる本の擬似コードでは here または here 彼らは次のように書きます:
if uncle.color == red:
# Handle case
else if z == z.p.right:
# Handle case 2
# Handle case 3
これはいけません:
if uncle.color == red:
# Handle case
else:
if z == z.p.right:
# Handle case 2
# Handle case 3
何か不足していますか?本はelse if
言うのとは異なる方法でPythonしますか?提供されたC++実装 here は、予想どおり2番目のバージョンを使用します。
コードのインデントは重要です:
if uncle.color == red:
# Handle case
else if z == z.p.right:
# Handle case 2
# Handle case 3
if
を省略してelse
と同じ行に表示されるため、構文は少し風変わりですが、ケース2は残りのケース3よりもさらにインデントされており、同じグループに属していません。
これは著者が意図したものだと私は思います:
if (uncle.color == red)
{
# Handle case
}
else
{
if (z == z.p.right)
{
# Handle case 2
}
# Handle case 3
}