Я пытаюсь сделать функцию удаления узла в BST, и мне нужно передать указатель по ссылке, чтобы я мог изменить указатель, но я продолжаю получать эту ошибку:
'void Tree::deletNode(T,Node *&)': невозможно преобразовать аргумент 2 из 'Node *' в 'Node *&'
Есть 2 из этих ошибок, и они происходят в deletNode при рекурсивном вызове самого себя.
Программа запускается, когда у меня нет &, но она не работает должным образом.
Это две мои функции, которые должны удалить узел в BST. корневой указатель дерева называется корневым, а узел — типом узла. Также вызывается функция deletNode, которая вызывает makedelete. но пользователь вызывает deletNode
void deletNode(T num, Node<T> *& nodeptr)
{
if (num < nodeptr->getData())
deletNode(num, nodeptr->getLeft());
else if (num > nodeptr->getData())
deletNode(num, nodeptr->getRight());
else
{
cout << "called makedelete on " << nodeptr << "which has " << nodeptr->getData() << endl;
makedelete(nodeptr);
}
}
void makedelete(Node<T> *& nodeptr)
{
Node<T> * tempnode;
if (nodeptr == nullptr)
cout << "error..." << endl;
else if (nodeptr->getRight() == nullptr)
{
tempnode = nodeptr;
nodeptr = nodeptr->getLeft();
delete tempnode;
}
else if (nodeptr->getLeft() == nullptr)
{
tempnode = nodeptr;
nodeptr = nodeptr->getRight();
delete tempnode;
}
else //has 2 kids
{
tempnode = nodeptr->getRight(); ///move 1 node to right
while (tempnode->getLeft()) // go to end of left
{
tempnode = tempnode->getLeft();
}
tempnode->setLeft(nodeptr->getLeft());
tempnode = nodeptr;
nodeptr = nodeptr->getRight();
delete tempnode;
}
}
};
Вот класс узла:
template <typename T>
class Node
{
T data;
Node* left;
Node* right;
public:
T getData() { return data; }
Node<T>* getLeft() { return left; }
Node<T>* getRight() { return right; }
void setData(T t) { data = t; }
void setLeft(Node<T>* pLeft) { left = pLeft; }
void setRight(Node<T>* pRight) { right = pRight; }
};