我识别出这样的二叉树:
class Btree
{
public:
BtreeNode <T>* root;
...
}
然后我在二叉树类中编写一个插入函数,如下所示:
void Btree<T>::InsertNode2(T data, BtreeNode <T>* &root)
{
if (root==NULL)
{
root = new BtreeNode <T> (data);
//cout << root->data << endl;
return ;
}
if (data <= root->data)
InsertNode2(data, root->leftchild);
else
InsertNode2(data, root->rightchild);
}
当我调用此函数时:
Btree<int> *tree=new Btree<int>();
tree->InsertNode2(1, tree->root);
没关系。一切都很好。
但是如果我写另一个函数来获得root:
BtreeNode <T>* GetRoot(){ return this->root; }
当我调用InsertNode2时:
Btree<int> *tree=new Btree<int>();
tree->InsertNode2(1, tree->GetRoot());
有一个错误:对非const的引用的初始值必须是左值。 这两种方法的区别是什么?如何修改?我希望root是私有的。
答案 0 :(得分:1)
按值而不是通过引用获取BtreeNode指针。例如
void Btree<T>::InsertNode2(T data, BtreeNode <T>* root)
这可以解决您的问题。
答案 1 :(得分:0)
您的InsertNode2
函数是树的私有细节。您的树应具有公共插入界面,如下所示:
class Btree
{
BtreeNode <T>* root;
public:
void Insert(const T& data) { InsertNode2(data, root); }
// ...
};
树根当然也应该是树的私人细节。
您的GetRoot
函数返回根指针的副本,当然尝试修改副本是没有意义的。你可能不应该拥有 GetRoot
函数,因为见上文。