我正在尝试使用递归函数将节点插入二叉搜索树。但是,当我尝试调用我的函数时,我收到错误消息
no known conversion for argument 1 from ‘Node*’ to ‘Node*&’
这是递归函数的代码和调用它的函数:
bool BST::add(int data)
{
if (root == NULL)
{
Node* gnu = new Node(data);
root = gnu;
return true;
}
return recursiveAdd(root, data);
}
bool BST::recursiveAdd(Node*& start, int data)
{
if (start == NULL)
{
Node* gnu = new Node(data);
start = gnu;
return true;
}
if (data < start->getData())
{
return recursiveAdd(start->getLeft(), data);
}
if (data > start->getData())
{
return recursiveAdd(start->getRight(), data);
}
if (data == start->getData())
{
return false;
}
return false;
}
以下是我的Node类中getLeft(),getRight()和getData()的函数:
int Node::getData()
{
return data;
}
Node* Node::getLeft()
{
return leftChild;
}
Node* Node::getRight()
{
return rightChild;
}
如果有人能告诉我需要修复它以使其正常工作,我将非常感激。
谢谢!
答案 0 :(得分:1)
您的访问者返回内部指针的副本
Node* Node::getLeft()
{
return leftChild;
}
Node* Node::getRight()
{
return rightChild;
}
但是recursiveAdd
需要能够修改结构
start = gnu;
这些方法不兼容,你很幸运,编译器抓住了你。您可以更改getLeft()
和getRight()
以返回引用,也可以捕获recursiveAdd()
所做的结构更改并使用mutator传播它。
Node* theLeft = start->getLeft();
bool did_insert = recursiveAdd(theLeft, data);
start->setLeft(theLeft);
return did_insert;
或者,正如Matt所说,你可以让recursiveAdd
成为朋友而只是做
return recursiveAdd(start->leftChild, data);
答案 1 :(得分:1)
您不能将临时变量(由getLeft和getRight返回的副本)与非const左值引用绑定,因此会出错。
无论如何,您不需要修改指针本身。我建议你重写你的算法,而不需要这个相当奇怪且容易出错的要求。
答案 2 :(得分:0)
...
if (root == NULL)
{
Node* gnu = new Node(data);
root = gnu;
return true;
}
return recursiveAdd(root, data);
}
阻止范围。如果root
为NULL,那么您最终将不会在块之外的root
声明。这意味着将使用无效参数调用recursiveAdd()
;这无法编译,否则它总是有机会产生未定义的行为。
无论如何,由于root
将过期,引用也会过期,因为引用将指向临时对象。这是不正确的,因为引用不能绑定到临时对象 - 根据定义,它们将指向“容器值”,通常在C ++ 11用语中称为 lvalues 。 < / p>
还有 rvalues ,但这超出了问题的范围。