以下是我将元素插入二叉搜索树的代码。 insert函数有两个参数,value是要插入树的数字和root,它是树的根。
我的root->getLeft()
和root->getRight()
都返回BinaryNode*
,这就是为什么我认为它会返回此错误:
BST.cpp: In function ‘void insert(int, BinaryNode*&)’:
BST.cpp:72:34: error: invalid initialization of non-const reference of type ‘BinaryNode*&’ from an rvalue of type ‘BinaryNode*’
void insert(int value, BinaryNode*& root) {
cout << "Looping" << endl;
if(root == NULL) {
BinaryNode* node = new BinaryNode(value);
root = node;
cout << "finalized" << endl;
cout << "Root value: " << root->getValue() << endl;
}
else if(value < root->getValue()) {
insert(value, root->getLeft());
cout << "went to left" << endl;
}
else if(value >= root->getValue()) {
insert(value, root->getRight());
cout << "went to right" << endl;
}
}
如何修改root->getLeft()
以便传入正确的值(*&amp;)?
此外,*&amp;意思?我一直在测试只传入BinaryNode*
root,对root的更改似乎永远不会生效,例如root忘记了它在insert之外的值,而在过去只有*&amp;似乎努力改变原始的实际价值。
谢谢!
答案 0 :(得分:1)
这是C ++语言中的一条规则:You can not bind a r-value to l-value reference
考虑这个例子:
// Foo return a r-value
some_type foo();
// binding r-value to l-value reference is not valid
some_type& var = foo();
在这个例子中,我们从foo
返回一个临时对象,该对象在表示返回的赋值时将被销毁,因此我们将有一个悬空引用。这就是为什么你不能将r值绑定到l值引用。
在您的代码中root->getLeft()
返回类型为BinaryNode*
的r值,然后将其绑定到BinaryNode*&
,这是一个l值引用。
即使您可以绕过该错误,您的代码也会出现问题:root->getLeft()
返回一个临时变量指针,然后在insert
函数中通过它BinaryNode*& root
更改临时指针参数。您应该从(BinaryNode*&)
和getLeft()
返回对节点指针getRight()
的引用。