簡體   English   中英

二叉樹中的遞歸搜索

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM