クラスで、遅延削除を使用して BST を実装する課題があります。ノードが削除されると、削除済みとしてフラグが立てられるだけで、実際にツリーから削除されるわけではありません。ツリーで削除済みとしてフラグが付けられたすべてのノードを実際にハード削除したい場合のメソッドを作成する必要があります。
現在、ツリーを再帰する delete() メソッドを使用しています。削除済みのフラグが立てられたノードが見つかった場合、すべての削除メカニズムを使用して removeHard() を呼び出します。私は delete() メソッドをテストしましたが、ツリーを正しくトラバースしているようで、マークされたすべてのノードをキャッチしてから、 removeHard() メソッドに渡します。また、テストとしてメイン メソッドで removeHard() を公に呼び出すと、ノードが適切に削除されます。併せて、ノードをまったく削除しないか、重複を作成します。
protected void delete( FHlazySTNode<E> root )
{
if ( root == null )
return;
if ( root.rtChild != null )
delete(root.rtChild);
if (root.deleted)
removeHard(root);
if ( root.lftChild != null )
delete(root.lftChild);
}
protected FHlazySTNode<E> removeHard( FHlazySTNode<E> root )
{
if (root == null)
return null;
if (root.lftChild != null && root.rtChild != null)
{
root.data = findMin(root.rtChild).data;
root.deleted = findMin(root.rtChild).deleted;
root.rtChild = removeHard(root.rtChild);
}
else
{
root =
(root.lftChild != null)? root.lftChild : root.rtChild;
}
return root;
}