我在课堂上有一项任务,我们正在实施一个带有延迟删除的BST。删除节点后,它只会被标记为已删除,并且实际上不会从树中删除。当我们想要实际硬删除树中标记为已删除的所有节点时,我们必须为该情况创建一个方法。
现在我正在使用一个方法delete()来递减树。如果它发现标记为已删除的节点,则调用removeHard(),其中包含所有删除机制。我测试了delete()方法,我似乎正在遍历树并捕获所有标记的节点,然后传入我的removeHard()方法。另外,当我在我的main方法中公开调用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;
}