Метод жесткого удаления узлов в BST с отложенным удалением
У меня есть назначение в классе, где мы реализуем 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;
}