0

みんな私はレッドブラックツリーの削除アルゴリズムを実装しようとしていますが、このアルゴリズムの3行目を理解するのに問題があります(本「アルゴリズムの紹介」第2版から):

1 if left[z] = nil[T] or right[z] = nil[T]
2 then y ← z
3 else y ← TREE-SUCCESSOR(z)
4 if left[y] ≠ nil[T]
5 then x ← left[y]
6 そうでなければ x ← right[y]
7 p[x] ← p[y]
8 if p[y] = nil[T]
9 then root[T] ← x
10 else if y = left[p [y]]
11 then left[p[y]] ← x
12 else right[p[y]] ← x
13 if y 3≠z
14 then key[z] ← key[y]
15 yの衛星データをzにコピー
16 color[y] = BLACK の場合
17 then RB-DELETE-FIXUP(T, x)
18 return y

まず第一に、この本のどこにも TREE-SUCCESSOR がどのように見えるかを説明していません (そのためのアルゴリズムはありません) 。 ,14,15,4 を削除してから 7 を削除しようとすると、先行者が見つかりますが、11 を削除しようとすると後続者が見つかります。そして、それは私が理解できないものです。なぜ時には前任者が必要なのか、時には後継者が必要なのか? この決定を下す際に考慮される基準は何ですか? ノードの色?
ありがとうございました。

PS 13 行目に書かれていることもよくわかりません。y に 3 つの色 (黒でも赤でもない) があるかどうかということですか?

4

3 に答える 3

1

CLRS 第 2 版を読んでいると思います。

TREE-SUCCESSOR は、第 12 章セクション 2 - 「12.2 二分探索木のクエリ」で紹介されています。Jesse Naugher の言うこととは反対に、それは二分探索木の種類には依存しません。

引用した13行目はタイプミスです。「if y != z」のはずです。

于 2011-06-10T22:26:25.197 に答える
1

ツリーの後継者 (tree-predecessor [私が信じている本にある] の反対) は、通常、二分探索ツリーでは次に高いキーを持つノードとして定義されます。それがどのようにそれを決定するかはタイプ (この場合は赤黒) に依存しており、私はあなたの本が後継者の方法を演習として残していることをほぼ確信しています。(私は問題を覚えています:P)

于 2010-08-10T17:41:57.763 に答える
0

次のコードを参照できます。

http://code.google.com/p/cstl/source/browse/src/c_rb.c

于 2011-04-12T13:29:34.507 に答える