while循环条件检查

while-loop condition check

我正在尝试用 C 语言创建一个二叉搜索树。

我已经弄明白了大部分,但有件事一直困扰着我,即使我完成了任务。

这是搜索函数,它应该 return 与节点的数据(在本例中为 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;

}

当一个键不在二叉树中(因此应该 return 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),条件是否得到再次检查?

我觉得我遗漏了一些对你们大多数人来说很明显的东西。感谢您的帮助!

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

声明:

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

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

当你到达叶节点时,

会将 NULL 存储到 temp

但是,紧接着,您做了:if(temp->key == key)。如果 tempNULL.

,这将崩溃并烧毁

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

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

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