我正在尝试实施BST搜索方法以在BST中查找密钥。以下是代码。
node* search_key(node **root,int key)
{
if (*root == NULL || (*root)->data == key ){
return (*root);
}
if ( key < (*root)->data ) {
search_key(&(*root)->left, key);
}
else{
search_key(&(*root)->right, key);
}
}
除了搜索根节点外,上面的代码总是返回null。我将代码修改为以下内容,它完美地运行。 有人可以解释一下这里涉及的递归吗?
node* search_key(node **root,int key)
{
if (*root == NULL || (*root)->data == key ){
return (*root);
}
if ( key < (*root)->data ) {
return search_key(&(*root)->left, key); // note return
}
else{
return search_key(&(*root)->right, key);
}
}
答案 0 :(得分:3)
在第一个代码片段中,您有一个应该返回某些内容的函数,但在某些情况下不会这样做。这将导致未定义的行为。
在第二个片段中,您实际上会在函数的所有路径中返回一些内容。
答案 1 :(得分:1)
当您使用某个功能调用相同的功能或其他功能时,它会调用该功能,当它完成时,呼叫将返回到呼叫者功能
这里呼叫将返回呼叫者,但由于您不是返回任何结果。
因此,在将值返回到被调用函数后,它开始显示正确的结果。
答案 2 :(得分:0)
在实现递归时,我们应该始终确保在我们递归调用函数时对于每个条件,然后应该有一个&#34; return&#34;语句以便函数的直接调用者将获得结果值,因此在递归结束时将返回最终值。
如果不使用return语句,该怎么办:
如果没有return语句,那么当前函数计算的值将被丢弃或未保存,以便直接调用者不会获得任何值,并且最终将导致未定义的行为。
答案 3 :(得分:0)
在二叉树中,左根和右根有2个根。所以你的第一个条件是说如果你在最后一个节点(其中root == NULL)或你发现键(root-&gt;数据的值与key的值匹配)那么,程序返回包含数据的确切块(那里不是递归的)。
if (*root == NULL || (*root)->data == key ){
return (*root);
第二个条件是,如果密钥小于存储在root->data
中的值,则节点转到左根。因此,行return
search_key(root-&gt; left,key)`表示:重做相同的操作但现在转到左根。
if ( key < (*root)->data ) {
return search_key(&(*root)->left, key);
}
所以,让我们假设在左根,root->data
高于键,
所以行return search_key(root->right,key)
表示重做此操作,但现在转到右根。
else{
return search_key(&(*root)->right, key);
}
只有当您在某处找到钥匙或者检查所有内容而您没有找到任何内容时,递归才会结束。所以请记住,递归意味着一次又一次地重做它。