Granville Barnettの「DataStructuresandAlgorithms」のBSTアルゴリズムに従おうとしていますが、以下で説明するノード削除アルゴリズムがわかりません。
セクション3.3(p。22)
BSTからノードを削除するのはかなり簡単で、次の4つのケースを考慮する必要があります。
- 削除する値はリーフノードです。また
- 削除する値には右側のサブツリーがありますが、左側のサブツリーはありません。また
- 削除する値には左側のサブツリーがありますが、右側のサブツリーはありません。また
- 削除する値には、左と右の両方のサブツリーがあります。この場合、左のサブツリーで最大の値を昇格させます。
図3.2(p。22)
23
/ \
14 31
/
7
\
9
- ケース#1はノード9を指します。
- ケース#2はノード7を指しています。
- ケース#3はノード14を指しています。
- ケース#4はノード23を指しています。
上記の#4のテキストは、23を削除すると、14をルートに昇格させ、31を正しい子にすることを意味すると解釈します。
14
/ \
7 31
\
9
...しかし、ケース#4の本のアルゴリズム(23ページから)は私を悩ませます(私はここでJavaで書き直しました):
1 boolean remove(T value) {
2 // ...
3
4 // case #4
5 Node largestValueNode = nodeToRemove.left;
6 while (largestValueNode.right != null) {
7 // find the largest value in the left subtree of nodeToRemove
8 largestValueNode = largestValueNode.right;
9 }
10
11 // delete the right child of largestValueNode's parent
12 findParent(largestValueNode.value).right = null;
13 nodeToRemove.value = largestValueNode.value;
14
15 count--;
16 return true; // successful
17}
アルゴリズムに従うと、largestValueNode
はノード14なので、その親はノード23になります。なぜアルゴリズムは親の正しい子を無効にするのですか?
largestValueNode
13行目がの値を削除するノードにコピーするのはなぜですか?
11〜13行目は次のようになると思います。
11 if (largestValueNode != null)
12 largestValueNode.right = nodeToRemove.right;
13 nodeToRemove.right = null;
編集:
この本のアルゴリズムには確かにバグがあります。修正は以下のとおりです。
1 boolean remove(T value) {
2 // ...
3
4 // case #4
5 Node largestValueNode = nodeToRemove.left;
6 while (largestValueNode.right != null) {
7 // find the largest value in the left subtree of nodeToRemove
8 largestValueNode = largestValueNode.right;
9 }
10
11 Node p = findParent(largestValueNode.value);
12 if (p != null) {
13 if (nodeToRemove == p)
14 nodeToRemove.left = largestValueNode.left;
15 else
16 p.right = largestValueNode.left;
17 }
18 nodeToRemove.value = largestValueNode.value;
19
20 count--;
21 return true; // successful
22}