我想知道为什么我们必须在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;
}
}
答案 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);
我希望这能澄清你的怀疑。