我正在尝试用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),是否会再次检查条件?
我觉得我错过了一些对你们大多数人来说非常明显的东西。任何帮助表示赞赏!
答案 0 :(得分:4)
不,while
循环(以及一般的C语言)不会做后面的事情,例如在条件变量发生变化时重新评估条件。
声明:
if(temp->key < key)
temp = temp->right;
else
temp = temp->left;
(请在stackoverflow上格式化代码 正确 )
当您到达叶节点时,会将NULL
存储到temp
。
但是,之后立即执行:if(temp->key == key)
。如果temp
为NULL
,则会崩溃并烧毁。
因此,通过重新排列语句,可以避免在temp->key
为temp
时尝试访问NULL
的情况。
这种检查和分支的标准方法如下:
if( temp->key < key )
temp = temp->right;
else if( temp->key > key )
temp = temp->left;
else //temp->key == key
return temp->data;