在二叉搜索树的insert方法中返回指向节点的指针

时间:2014-08-02 19:52:07

标签: c pointers data-structures binary-search-tree

我想知道为什么我们必须在BST的insert函数中返回指向根节点的指针。 即使我们没有将指针返回到根节点,也不会更新BST,因为我们正在更新指针映射到的内存中的数据? 以下代码

struct node* insert(struct node* node, int data) 
{
    /* 1. If the tree is empty, return a new, single node */
    if (node == NULL)    
        return(newNode(data));

    /* 2. Otherwise, recurse down the tree */
    else
    {
        if (data <= node->data)
            node->left  = insert(node->left, data);
        else
            node->right = insert(node->right, data);

        /* return the (unchanged) node pointer */
        return node;
    }
}

3 个答案:

答案 0 :(得分:2)

在调用者传入空树(空指针)的情况下,此函数必须返回指向树的指针,以便调用者现在具有非空树。在树非空的情况下,该函数在某个时刻递归并返回一个新的子树。如果根节点没有更改,您可以编写此代码的版本返回NULL(或其他一些值),但这会使代码更复杂。这是最简单的方法。

答案 1 :(得分:0)

在此实现中,函数必须返回一个节点,否则递归将中断。您的条件表示将node-&gt; left或node-&gt;右指针重新分配给递归调用的结果。因此,它最终会期望返回一个节点值。

如果你把return语句拿出来,我认为这段代码不会编译。

答案 2 :(得分:0)

正如其他人所建议的那样,它只是算法的一部分,否则node->left = insert(node->left, data);将不起作用。

这是一个不返回任何内容的算法(在C / C ++中):

void Insert(struct node** node, int key)
{
    if(*node == NULL) *node = newNode(key);
    else insert(*node, key);
}

void insert(struct node* node, int key)
{
    if (key < node->key)
    {
        if(node->left == NULL) node->left = newNode(key);
        else insert(node->left, key);
    }

    else if (key > node->key)
    {
        if(node->right == NULL) node->right = newNode(key);
        insert(node->right, key);
    }
}

这里,newNode(key)是一个函数,它创建一个新节点并设置其参数中提供的键值。

请注意,只使用底部给出的insert函数可以完成这项工作,除非node为NULL(即树为空)。这就是为什么我使用单独的Insert函数来处理这种情况。

您可以将元素插入:

Insert(&root,50);

我希望这能澄清你的怀疑。

相关问题