在二叉搜索树中插入节点 (C)

Kev*_*Hsu 3 c binary-search-tree

我正在尝试编写一个函数来将一个节点插入到二叉搜索树中,我有以下内容:

typedef struct Node {
    int key;
    struct Node *left;
    struct Node *right;
} Node;

Node *createNode(int key)
{
    Node *newNode = (Node *)malloc(sizeof(Node));
    newNode->key = key;
    newNode->left = NULL;
    newNode->right = NULL;

    return newNode;
}

Node *insert(Node *node, int key)
{
    if (node==NULL)
    {
        node = createNode(key);
    }
    else
    {
        if (node->key > key)
        {
            node->left = insert(node->left, key);
        }
        else
        {
            node->right = insert(node->right, key);
        }
    }
    return node;
}

int main(int argc, char* argv[])
{
    Node *root = NULL;
    root = insert(root, 10);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我知道这行得通,如果我想用根节点将 5 插入到树中root,我可以写root = insert(root, 5);. 我的问题是,我怎样才能编写另一个版本insert,可以简单地实现同样的事情insert(root, 5);?我尝试了以下但无济于事。

void insert(Node *node, int key)
{
    if (node==NULL)
    {
        node = createNode(key);
    }
    else
    {
        if (node->key > key)
        {
            insert(node->left, key);
        }
        else
        {
            insert(node->right, key);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这有什么问题,为什么这不起作用?任何指针(无双关语)将不胜感激!

lrl*_*eon 6

对我来说,你的第一个解决方案很优雅。

现在,如果您想在不利用返回值的情况下插入,则可以使用指向指针的指针。

就像是:

void insert(Node ** node, int key)
{
    if (*node == NULL)
      *node = createNode(key);
    else if ((*node)->key > key)
      insert(&(*node)->left, key);
    else
      insert(&(*node)->right, key);
}
Run Code Online (Sandbox Code Playgroud)

电话将是

insert(&root, 10);
Run Code Online (Sandbox Code Playgroud)