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); } } |
在第一个代码片段中,您有一个函数应该返回一些东西,但在某些情况下不会这样做。这将导致未定义的行为。
在第二个片段中,您实际上在函数的所有路径中返回了一些内容。
当你调用同一个函数或另一个函数时,它会调用该函数,当它完成调用时返回调用者函数,这里调用返回调用者但没有结果,因为你没有返回任何结果。
所以在将值返回给被调用函数后,它开始显示正确的结果。
跟随这张阶乘函数的图片更好地理解
二叉树有2个根,左根和右根。因此,您的第一个条件表示您是否在最后一个节点(其中 root == NULL)或者您找到键(root->data 上的值与键的值匹配)所以,程序返回包含数据的确切块(它不是递归的)。
1 2 | if (*root == NULL || (*root)->data == key ){ return (*root); |
第二个条件说如果键小于存储在
1 2 3 | if ( key < (*root)->data ) { return search_key(&(*root)->left, key); } |
所以,让我们假设在左根中,
所以行
1 2 3 | else{ return search_key(&(*root)->right, key); } |
只有当您在某处找到密钥或检查所有内容但没有找到任何内容时,递归才会结束。所以请记住,递归意味着一次又一次地重做。
在实现递归时,我们应该始终确保当我们递归调用函数时,对于每个条件,都应该有一个"return"语句,以便函数的直接调用者将获得结果值,因此在最后递归的最终值将被返回。
如果不使用return语句怎么办:
如果没有返回语句,那么当前函数计算的值将被丢弃或不保存,这样直接调用者就不会得到任何值,并且最终会出现未定义的行为。