[英]while-loop condition check
我想在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;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.