Узел отказывается удалять в бинарном дереве поиска - PullRequest
0 голосов
/ 02 мая 2018

Итак, у меня есть 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; };

...