Итак, у меня есть BST объектов, но по какой-то причине, когда я пытаюсь удалить узел из BST, он отказывается. Я использовал эту же функцию раньше, но в BST узлы были заполнены строками и целыми числами. В этой программе узлы заполнены объектами. Кроме того, проблема не возникает из-за поиска, потому что когда я отлаживаю, я вижу, что он правильно находит искомый узел, но по какой-то причине, когда он достигает вызова удаления, он ничего не делает, кроме искажения данных в объекте немного.
</p>
<pre><code>template <typename DATATYPE, typename KEYTYPE>
Node<DATATYPE, KEYTYPE> * BSTree<DATATYPE, KEYTYPE>::deleteNode(Node<DATATYPE, KEYTYPE> * aRoot,KEYTYPE value)
{
/* Given a binary search tree and a key, this function deletes the key
and returns the new root */
// base case
if (aRoot == nullptr) return aRoot;
// If the key to be deleted is smaller than the aRoot's key,
// then it lies in left subtree
if (value.year < aRoot->Key().year)
aRoot->setLeft(deleteNode(aRoot->Left(), value));
// If the key to be deleted is greater than the root's key,
// then it lies in right subtree
else if (value.year > aRoot->Key().year)
root->setRight(deleteNode(aRoot->Right(), value));
// if key is same as root's key, then This is the node
// to be deleted
else
{
/* first recur on left child */
deleteNode(aRoot->Left(), value);
/* now check if data matches*/
if((value.film == aRoot->Key().film)&&(value.name == aRoot->Key().name)&&(value.winner == aRoot->Key().winner)&&(value.award == aRoot->Key().award)&&(value.year == aRoot->Key().year))
{
// node with only one child or no child
if (aRoot->Left() == nullptr)
{
Node<DATATYPE, KEYTYPE> *temp1 = aRoot->Right();
//this is where it ignores the delete
delete aRoot;
cout << "Success!\n";
return temp1;
}
else if (aRoot->Right() == nullptr)
{
Node<DATATYPE, KEYTYPE> *temp2 = aRoot->Left();
//this is where it ignores the delete
delete aRoot;
cout << "Success!\n";
return temp2;
}
// node with two children: Get the inorder successor (smallest
// in the right subtree)
Node<DATATYPE, KEYTYPE> * temp = min(aRoot->Right());
// Copy the inorder successor's content to this node
aRoot->setKey(temp->Key());
aRoot->setData(temp->Data());
// Delete the inorder successor
aRoot->setRight(deleteNode(aRoot->Right(), temp->Key()));
cout << "Success!\n";
}
/*now recur on the right child*/
deleteNode(aRoot->Right(), value);
}
return aRoot;
}
</p>
<pre><code>void setLeft(Node<DATATYPE, KEYTYPE> * aLeft) { left = aLeft; };
void setRight(Node<DATATYPE, KEYTYPE> * aRight) { right = aRight; };