Метод жесткого удаления узлов в 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;
}

0 ответов

Другие вопросы по тегам