【问题标题】:while-loop condition checkwhile循环条件检查
【发布时间】:2017-04-03 21:33:15
【问题描述】:

我正在尝试在 C 中创建二叉搜索树。

我已经弄清楚了大部分的部分,但是即使我完成了任务,有一件事仍然困扰着我。

这是搜索功能,它应该与节点的数据一起返回(在这种情况下为temp->data)。

但是,当我写出如下代码时,它一直给我错误:

char bst_search(int key){

tree_pointer temp = root;

  while(temp != NULL){ 

        if(temp->key < key){ // navigate down the tree
        temp = temp->right;
        } else temp = temp->left;

        if(temp->key == key){
        return temp->data;
        }

   }    

return NULL;

}

当键不在二叉树中(因此应返回 NULL)并不断崩溃时,此函数失败。在尝试了几种可能性之后,我意识到将键检查移到 while 循环的前面部分解决了这个问题。

char bst_search(int key){

tree_pointer temp = root;

    while(temp != NULL){

      if(temp->key == key){
        return temp->data;
       }

      if(temp->key < key){ // navigate down the tree
         temp = temp->right;
       } else temp = temp->left;

    }   

return NULL;

}

我很好奇,当循环条件 (temp) 中的变量在其循环的主体代码中被修改时(因为 temp 已更改为 temp->left 或 temp->right),是否再次检查条件?

我觉得我错过了一些对你们大多数人来说很明显的东西。任何帮助表示赞赏!

【问题讨论】:

    标签: c data-structures binary-search-tree dev-c++


    【解决方案1】:

    不,while 循环(以及一般的 C 语言)不会在你背后做一些事情,比如在条件变量发生变化时重新评估条件。

    声明:

        if(temp->key < key)
            temp = temp->right;
        else
            temp = temp->left;
    

    (请在 stackoverflow 上正确格式化您的代码)

    当您到达叶节点时,会将NULL 存储到temp

    但是,紧接着,您可以:if(temp-&gt;key == key)。如果tempNULL,这将崩溃并烧毁。

    因此,通过重新排列语句,您可以避免在 tempNULL 时尝试访问 temp-&gt;key 的情况。

    这种检查和分支的标准方法如下:

        if( temp->key < key )
            temp = temp->right;
        else if( temp->key > key )
            temp = temp->left;
        else //temp->key == key
           return temp->data;
    

    【讨论】:

    • 感谢您的评论 :D \n 当它到达叶节点并且 temp 变为 NULL 时,while 循环不应该中断(因为条件是!= NULL)并继续返回NULL 在底部?
    • 应该,为了让算法正常工作,但你必须这样做,而这不是你正在做的。看看我的答案的修改。
    • C 像状态机一样工作。每次迭代它只会检查一次条件。无论如何,我想说的是:使用 gdb、lldb 或其他调试器来单步调试您的代码。您很快就会发现此类错误。
    猜你喜欢
    • 2019-11-23
    • 2011-03-31
    • 2011-09-09
    • 2023-03-06
    • 1970-01-01
    • 2013-12-29
    • 2016-03-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多