while-loop条件检查

时间:2016-11-20 12:36:15

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

我正在尝试用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)中的变量在其&#39;的主体代码中被修改时。循环(因为temp已经改为temp-&gt; left或temp-&gt; right),是否会再次检查条件?

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

1 个答案:

答案 0 :(得分:4)

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

声明:

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

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

当您到达叶节点时,

会将NULL存储到temp

但是,之后立即执行:if(temp->key == key)。如果tempNULL,则会崩溃并烧毁。

因此,通过重新排列语句,可以避免在temp->keytemp时尝试访问NULL的情况。

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

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