2 つの子を持つノードを削除する場合、順序どおりの後続ノードまたは順序どおりの先行ノードのいずれかを選択できます。この場合、左のサブツリー (左のサブツリーの右端の子を意味する) で最大値を見つけています。つまり、ノードの順序どおりの先行ノードを見つけています。
置換ノードが見つかったら、削除するノードを実際に削除するわけではありません。代わりに、後続ノードから値を取得し、その値を削除するノードに保存します。次に、後続ノードを削除します。そうすることで、選択したノードの値が元のノードの左側のサブツリーのすべての子の値よりも低く、その値よりも大きくなることを確認できるため、二分探索ツリー プロパティを保持します。元のノードの右側のサブツリーにあるすべての子の。
編集
あなたの質問をもう少し読んだ後、私は問題を見つけたと思います。
delete
通常、関数に加えて、replace
問題のノードを置き換える関数があります。このコード行を変更する必要があると思います:
FindParent(largestValue).Right <- 0
に:
FindParent(largestValue).Right <- largestValue.Left
largestValue
ノードに左の子がない場合は、単にnull
orを取得します0
。左の子がある場合、その子はlargestValue
ノードの代わりになります。その通りです。largestValue
このコードは、ノードが左の子を持つ可能性があるというシナリオを考慮していません。
別の編集
スニペットを投稿しただけなので、コードのコンテキストが何であるかわかりません。しかし、投稿されたスニペットには、あなたが提案する問題があるようです (間違ったノードを置き換える)。通常、3つのケースがありますが、スニペットのコメントにあることに気付きました//Case 4
(したがって、他のコンテキストがある可能性があります)。
先ほど、 にはdelete
通常replace
. そのため、ノードが見つかったらlargestValue
、2 つの単純なケース (子のないノードと 1 つの子を持つノード) に従って削除します。したがって、2 つの子を持つノードを削除する疑似コードを見ている場合は、次のようにします。
get largestValue from nodeToRemove.Left
nodeToRemove.Value <- largestValue.Value
//now replace largestValue with largestValue.Left
if largestValue = largestValue.Parent.Left then
largestValue.Parent.Left <- largestValue.Left //is largestValue a left child?
else //largestValue must be a right child
largestValue.Parent.Right <- largestValue.Left
if largestValue.Left is not null then
largestValue.Left.Parent <- largestValue.Parent
Data Structures And Algorithms の本でこの部分が省略されているのは奇妙だと思います。理解する。
上記のコードが機能することを証明するには、次のツリーを検討してください。
8
/ \
7 9
を削除したいとしましょう8
。largestValue
から検索しようとしますnodeToRemove.Left
。7
左側のサブツリーには子が 1 つしかないため、これが得られます。
次に、次のようにします。
nodeToRemove.Value <- largestValue.Value
つまり:
8.value <- 7.Value
また
8.Value <- 7
したがって、ツリーは次のようになります。
7
/ \
7 9
置換ノードを取り除く必要があるためlargestValue
、largestValue.Left
(これはnull
) に置き換えます。そのため、まず、どのような子供7
であるかを調べます。
if largestValue = largestValue.Parent.Left then
つまり:
if 7 = 7.Parent.Left then
また:
if 7 = 8.Left then
7
はの左子なので、( )8
に置き換える必要があります。子がないため、nullです。そのため、 nullに割り当てられます (左の子が効果的に削除されます)。したがって、これは次のツリーになることを意味します。8.Left
7.Right
largestValue.Parent.Left <- largestValue.Left
7
7.Left
largestValue.Parent.Left
7
\
9