在二叉搜索树中插入节点(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约束。