无法访问二叉树中的创建的节点

时间:2019-04-24 18:32:34

标签: c++

我创建了一个二叉树类,可以使用以下函数创建新节点:

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'))。如果有人可以指出我做错的任何事情,将不胜感激。如果需要提供更多代码,可以。

1 个答案:

答案 0 :(得分:0)

通过值传递指针不会影响原始指针,但是只会影响仅指向的对象。

解决此问题的最简单方法是通过root nodepointer to pointer传递reference to pointer

template <class Type>
void BinTree<Type>::insertNode(BinNode *& root, Type data) {
    if (root == nullptr) {
    root = new BinNode(data);
    // ...
}