【问题标题】:Search element in binary search tree二叉搜索树中的搜索元素
【发布时间】:2021-11-04 20:56:32
【问题描述】:
struct node {
    int data;
    struct node *left; /* left tree part */
    struct node *right; /* right tree part */
};

bool search(struct node *root, int element) {
    
    if ( root -> data == element) {
        return true;
    }

    if (root->data < element) {
        search (root->right, element);
    }
    if (root->data > element) {
        search(root->left, element);
    }
    return false;

}

如果在二叉搜索树中找到给定元素,我希望该程序返回 true。否则返回假。这个递归进度有什么问题?

【问题讨论】:

  • 如果root-&gt;right 为空怎么办?
  • 你应该对递归调用的结果做一些事情

标签: c binary-search-tree


【解决方案1】:

这个递归进度有什么问题?

正如 cmets 中所提到的,您没有对该函数中递归调用的结果做任何事情。你想像这样返回它们:

if (root->data < element) {
    return search(root->right, element);
}
if (root->data > element) {
    return search(root->left, element);
}

一旦你达到了终止递归调用的条件,你就会看到元素是否被找到。

bool search(struct node *root, int element) {

    // element is not found
    if(!root) return false;
    
    // element is found
    if (root->data == element) {
        return true; // terminate recursive calls
    }

    if (root->data < element) {
        return search(root->right, element);
    }
    if (root->data > element) {
        return search(root->left, element);
    }

}

编辑:要小心,不像我,一定要检查 root 是否为 null ;)

【讨论】:

  • 啊,是的 if(!root) 好电话
  • 在这段代码中,对于静态分析器来说,每个路径都返回一个值可能并不明显。如godbolt.org/z/3v8zzs5Gj - 警告:非空函数不会在所有控制路径中返回值 [-Wreturn-type] 虽然很明显它确实如此。一些elses 会有所帮助。
  • 谢谢!我忘了返回递归调用
  • 可以,用else代替最后一个if()
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多