我试图在BST中创建一个删除节点函数,我需要通过引用传递一个指针,这样我就可以更改指针,但是我一直收到这个错误:
'void Tree :: deletNode(T,Node *&)':无法将参数2从'Node *'转换为'Node *&'
有两个这样的错误,它们在递归调用自身时发生在deletNode中。
当我没有&但它没有按预期工作。
这是我的2个函数,它们应该删除BST中的节点。 树的根ptr称为root,Node是节点类型。 此外,调用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;
}
}
};
这是Node类:
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; }
};
答案 0 :(得分:2)
Node<T>* getLeft() { return left; }
按值返回。所以返回的Node<T>*
是暂时的。请注意,因为您返回left
值而不是对left
的引用或指向left
的引用,您无法修改left
通过调用getLeft
。
void deletNode(T num, Node<T> *& nodeptr)
这需要对Node<T>*
进行非const引用。
deletNode(num, nodeptr->getLeft());
在这里,您尝试在deletNode
返回的临时值上调用getLeft
。但是你不能将非const引用绑定到临时引用。您不能通过返回left
来修改getLeft
,因为它既不返回引用也不返回指针。
修复取决于你真正想做的事情,但绝对不要试图将临时文件传递给采用非const引用的函数。您是否期望拨打deletNode
来修改nodeptr->left
?如果是这样,getLeft
需要返回引用。
答案 1 :(得分:0)
nodeptr-&gt; getLeft()或nodeptr-&gt; getRight()会导致rvalue,并且您试图保持rvalue的引用是错误的。它在deletNode ..
在将它传递给deletNode之前,请执行此操作
Service<T,U,V>
你可以在c ++ 11中保存对rvalue的引用,为此,将deletNode的签名更改为
Node<int>* tmp = node->getLeft();
deletNode(tmp);