[英]Recursive search in binary tree
我是一個初學者,我被困在一個 function 上,它在無序二叉樹中搜索給定的鍵。 節點由值和指向左右節點的指針組成。 這是我的代碼:
node *btree::search(int key, node *leaf){
if(leaf != NULL)
{
if(key == leaf->value)
{
return leaf;
}
search(key, leaf->left);
search(key, leaf->right);
}
else
{
return NULL;
}
}
node *btree::search(int key){
return search(key, root);
}
在某些情況下,我的 function 返回正確的節點,但在其他情況下是運行時錯誤。 這有什么問題,可以做些什么來解決這個問題? 而且我不允許使用任何外部庫,例如隊列或其他庫。
這是一個相當常見的初學者錯誤。 您的遞歸 function 返回一個節點指針,但是當您進行遞歸調用時,您會忽略返回值。
search(key, leaf->left);
search(key, leaf->right);
它應該看起來像這樣
node* ptr = search(key, leaf->left);
if (ptr != NULL)
return ptr;
else
return search(key, leaf->right);
即返回通過在左子樹中搜索找到的節點,但如果是 NULL 則搜索右子樹並返回在那里找到的節點(如果有)。
當您編寫遞歸代碼時,您不僅要考慮遞歸調用,還要考慮遞歸調用返回的內容。
您調用未定義的行為,因為並非遞歸函數的所有代碼路徑都返回一個值。 這可能會導致“運行時錯誤”、崩潰或只是一些不可預知的結果。
順便說一句,搜索樹的優勢通常是您可以獲得對元素的平均訪問時間,運行時復雜度為 n*log(n)。 但是為此,樹必須是有序的,我無法想象無序二叉樹的有效用例; 在這種情況下,鏈表也可以完成這項工作。
如果是有序樹:
node *btree::search(int key, node *leaf){
if(leaf != NULL)
{
if(key == leaf->value) {
return leaf;
} else if (key < leaf->value) {
return search(key, leaf->left);
} else {
return search(key, leaf->right);
}
}
else
{
return NULL;
}
}
在無序樹的情況下:
node *btree::search(int key, node *leaf){
if(leaf != NULL)
{
if(key == leaf->value) {
return leaf;
}
leaf = search(key, leaf->left);
if (! leaf) {
leaf = search(key, leaf->right);
}
return leaf;
}
else
{
return NULL;
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.