c - while循环条件检查

标签 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)中的变量在其循环体代码中被修改时(因为 temp 已更改为 temp->left 或 temp->right),是否会再次检查条件?

我觉得我错过了一些对你们大多数人来说非常明显的事情。如有任何帮助,我们将不胜感激!

最佳答案

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

声明:

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

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

当到达叶节点时,会将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;

关于c - while循环条件检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40704076/

相关文章:

c++ - 将节点旋转到 BST 的根

java - 如何指定随机数的范围?

c - 仅使用putchar在c中打印一个整数

c - 使用赋值和 printf 时出现段错误 11

algorithm - 什么是保存累积值的良好数据结构?

java - 输出之前读取的 22 行 - Java

Ruby 二进制搜索代码未返回预期结果

C: 简单复制输入 (getchar) 到输出 (printf) 返回额外的行

c - AIX 的 XL 编译器的 -qfuncsect 选项的 gcc 等效选项是什么?

mysql - 多种页面类型相互连接的SQL数据库设计