二叉树节点指针

时间:2017-10-14 13:52:11

标签: c++ pointers binary-search-tree

我的二叉树结构

struct BST::Node
{
Key key;
Item item;

Node* leftChild;
Node* rightChild;

Node(Key k, Item i)
{
    key = k;
    item = i;

    leftChild = nullptr;
    rightChild = nullptr;

}
};

我正在尝试插入树中但是我收到一个错误,说明如果有一个处理程序可以安全地继续该程序。我认为我使用指针的方式可能有问题,但我不能100%确定它是什么,任何帮助都会受到赞赏,谢谢。这是我的insert方法,必须使用递归

void BST::insert(Key k, Item i)
{
    insertRec(k, i, root);
}

void BST::insertRec(Key k, Item i, Node* n)
{
    if (n == NULL)
    {
        n->item = i;
        n->key = k;
    }
    else if (k < n->key)
    {
        insertRec(k, i, n->leftChild);
    }
    else if (k > n->key)
    {
        insertRec(k, i, n->rightChild);
    }   
} 

Node * root是一个nullptr。

2 个答案:

答案 0 :(得分:0)

仔细查看代码中的以下代码段:

void BST::insertRec(Key k, Item i, Node* n)
{
    if (n == NULL)
    {
        n->item = i;
        n->key = k;
    }

您在n->item = i时设置n == NULL。这是错的! NULL指针不指向有效对象。

相反,您应该只分配一个新节点:

if (n == NULL)
{
    n = new Node(k, i);
}

但请记住,当您从树中删除节点时,在返回值后,您应始终delete它。

此外,您应该在构建BST类时使用相同的方法分配root,并在销毁期间delete分配。{/ p>

答案 1 :(得分:0)

您需要注意的事项很少: 1)里面

if (n == NULL)
{
    n->item = i;
    n->key = k;
}
在分配项目和键值之前,

上面的块,您需要为节点分配内存。

n =新节点(i,k);

2)现在,即使遵循上面提到的第一点,创建的新节点也不会被分配给BST的根(如果树为空),因为根通过值传递。因此要么将root作为引用传递,要么作为指针指向。根据您通过引用或指针指向传递的决定更改新节点创建部分。