while循环条件检查

3
我正在尝试在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),这个条件会再次被检查吗?

我感觉自己错过了大多数人都知道的显而易见的东西。任何帮助都将不胜感激!

1个回答

4
不,while循环(以及C语言)不会在背后执行一些操作,例如在条件变量更改时重新评估条件。
下面是需要翻译的内容:

该语句:

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

(请在stackoverflow上适当格式化您的代码)

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

然而,紧接着你做了这个: if(temp->key == key)。如果 tempNULL,这将导致程序崩溃。

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

进行此类检查和分支的标准方法如下:

    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时,由于条件是!= NULL,while循环不应该中断并继续执行底部的return NULL吗? - Chris Choi
为了算法正常工作,它应该这样做,但你必须这样做,而这不是你正在做的。请看我的答案修正。 - Mike Nakis
1
C语言的工作方式类似于状态机。它每次迭代只会检查一次条件。无论如何,我想说的是:使用像gdb、lldb或其他调试器来逐步执行您的代码。您将很快捕捉到这些错误。 - vindarmagnus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接