C中的BST搜索键

BST search key in C++

我试图实现 BST 搜索方法来查找 BST 中的键。下面是代码。

1
2
3
4
5
6
7
8
9
10
11
12
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);
    }
}

上面的代码总是返回空值,除了搜索根节点。我将代码修改为以下内容,并且运行良好。
谁能解释一下这里涉及的递归?

1
2
3
4
5
6
7
8
9
10
11
12
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);
    }
}


在第一个代码片段中,您有一个函数应该返回一些东西,但在某些情况下不会这样做。这将导致未定义的行为。

在第二个片段中,您实际上在函数的所有路径中返回了一些内容。


当你调用同一个函数或另一个函数时,它会调用该函数,当它完成调用时返回调用者函数,这里调用返回调用者但没有结果,因为你没有返回任何结果。

所以在将值返回给被调用函数后,它开始显示正确的结果。

跟随这张阶乘函数的图片更好地理解enter

二叉树有2个根,左根和右根。因此,您的第一个条件表示您是否在最后一个节点(其中 root == NULL)或者您找到键(root->data 上的值与键的值匹配)所以,程序返回包含数据的确切块(它不是递归的)。

1
2
if (*root == NULL || (*root)->data == key ){
    return (*root);

第二个条件说如果键小于存储在root->data中的值,则节点转到左根。因此,returnsearch_key(root->left,key)` 行的意思是:重做相同的操作,但现在转到左根。

1
2
3
if ( key < (*root)->data ) {
     return search_key(&(*root)->left, key);
}

所以,让我们假设在左根中,root->data 高于键,
所以行 return search_key(root->right,key) 表示重做这个操作,但现在转到正确的根目录。

1
2
3
else{
     return search_key(&(*root)->right, key);
}

只有当您在某处找到密钥或检查所有内容但没有找到任何内容时,递归才会结束。所以请记住,递归意味着一次又一次地重做。


在实现递归时,我们应该始终确保当我们递归调用函数时,对于每个条件,都应该有一个"return"语句,以便函数的直接调用者将获得结果值,因此在最后递归的最终值将被返回。

如果不使用return语句怎么办:

如果没有返回语句,那么当前函数计算的值将被丢弃或不保存,这样直接调用者就不会得到任何值,并且最终会出现未定义的行为。