我创建了一个二叉树类,可以使用以下函数创建新节点:
template <class Type>
void BinTree<Type>::insertNode(BinNode * root, Type data) {
if (root == nullptr) {
root = new BinNode(data);
}
else if (root->balance == 'l') {
root->balance = 'r';
insertNode(root->left, data);
}
else if (root->balance == 'r') {
root->balance = 'l';
insertNode(root->right, data);
}
}
该函数将编译;但是,当创建新节点时,它们似乎是在本地创建的,并且一旦功能完成,就不会添加节点。给定一个空树,该函数执行以下步骤:
第1步:使用其他功能,树会创建一个节点并将rootptr设置为该节点。
第2步:如果要添加另一个节点,它将调用此函数并将rootptr作为第一个参数传递给此处。在此步骤中,隐式参数和第一个参数相同。该功能继续并检查是否最后一个节点已添加到左侧或右侧(默认为左侧或“ l”,主要是为了进行测试而选择此设计)。现在再次调用相同的函数,但现在它通过root->left
(或原始rootptr的左子指针)作为第一个参数。
步骤3:根据我的理解,使用新函数调用后,隐式参数仍应为rootptr,但这一次,第一个参数是rootptr的左子指针。由于它为null,因此将为指针创建一个新对象。然后该函数退出,但是一旦退出,由于它似乎是局部变量,因此数据将丢失。
我尝试使insertNode
函数返回BinNode *
,但这引起了某种错误(我可以更详细地介绍这个问题,但是我认为这可能是因为它是模板类吗? )。我也尝试将第一个参数作为双指针传递,但是我遇到了另一个错误,特别是在行else if (root->balance == 'l')
上,甚至指出“'-> balance'的左边必须指向类/结构/联合/泛型”尽管我在使用->运算符之前先对其进行了取消引用(例如else if ((*root)->balance == 'l')
)。如果有人可以指出我做错的任何事情,将不胜感激。如果需要提供更多代码,可以。
答案 0 :(得分:0)
通过值传递指针不会影响原始指针,但是只会影响仅指向的对象。
解决此问题的最简单方法是通过root node
或pointer to pointer
传递reference to pointer
:
template <class Type>
void BinTree<Type>::insertNode(BinNode *& root, Type data) {
if (root == nullptr) {
root = new BinNode(data);
// ...
}