【发布时间】:2015-12-17 05:58:50
【问题描述】:
我试图实现 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);
}
}
上面的代码总是返回空值,除了搜索根节点。我将代码修改为以下内容,并且运行良好。 谁能解释一下这里涉及的递归?
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);
}
}
【问题讨论】:
-
我不禁想知道你为什么要传递
node **root而不仅仅是node *root。使用双指针会使代码不必要地笨拙,而不会带来任何明显的好处。如果您要更改root指向的值,双指针将是有益的;就目前而言,我没有看到任何好处,并且确实看到了一些不利因素(它会更慢,除此之外,因为它需要额外的间接级别;当然,这种放缓是否可衡量是另一个问题)。 -
要扩展@JonathanLeffler 的评论,即使您想修改指针,如果您使用 C++ 编程,您可能应该使用引用而不是额外的指针间接。最终结果将是相同的,但语法更好,并且更容易理解该函数对普通读者(将来包括你)的作用。
-
我只是在试验指针并想深入学习指针,因此我选择通过保持 root 本地而不是全局来使用 node **root。在生产中实施类似的东西时,我会牢记上述建议。感谢您的宝贵反馈。