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

在二叉搜索树中插入节点(C),c,binary-search-tree,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

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

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;
}
我知道这是可行的,如果我想在根节点为root的树中插入5,我可以编写
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);
        }
    }
}

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

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

现在,如果您想在不利用返回值的情况下插入,那么可以使用指针到指针的方法

比如:

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);
}
电话号码是

insert(&root, 10);

简短回答:没有。在某些情况下,您需要更改root的值。(例如:当树为空且根为空时)一种方法是通过使用返回值的assignmnt(如您的工作示例中所示),另一种方法是将指针传递给指针。(指向根的指针)指向函数。原因是,在BST中插入值时,必须确保BST仍然是BST(例如,左子节点包含的值小于父节点的节点,右子节点仅包含的值大于或等于父节点的节点)。这意味着您必须在插入时检查几个条件,并且可能必须移动节点或叶(或根节点)以满足BST约束。