web-dev-qa-db-ja.com

Introduction to Algorithms(CLRS)のこのRed-Blackツリー挿入疑似コードは正しいですか?

赤黒木挿入の修正について、本は6つのケースを区別し、そのうち3つは対称的です。ケースは次のとおりです(zは挿入されるノードです):

  • ケース1:zの叔父が赤
  • ケース2:zの叔父が黒でzが正しい子である
  • ケース3:zの叔父が黒で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番目のバージョンを使用します。

7
Bar

コードのインデントは重要です:

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 
}
10
Rufflewind