我正在尝试用 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)
。如果 temp
为 NULL
,这将崩溃并烧毁。
因此,通过重新排列语句,您可以避免当 temp
为 NULL
时尝试访问 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/