【发布时间】:2015-11-15 01:11:48
【问题描述】:
我正在尝试编写一个将节点插入二叉搜索树的函数,我有以下内容:
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;
}
我知道这是可行的,如果我想将 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);
}
}
}
这有什么问题,为什么这不起作用?任何指针(没有双关语)将不胜感激!
【问题讨论】:
-
简短回答:不。在某些情况下,您需要更改 root 的值。 (例如:当树为空,根为 NULL 时)一种方法是通过使用返回值的赋值(如您的工作示例中所示)另一种方法是传递指向指针的指针。 (指向根的指针)到函数。
-
原因是,当您在 BST 中插入值时,您必须确保 BST 保持 BST,(例如,左子节点包含值小于比父节点,而右子节点仅包含值大于或等于父节点的节点。)。这意味着您必须在插入时检查多个条件,并且您可能必须移动节点或叶(或根节点)以满足 BST 约束。
标签: c binary-search-tree