簡體   English   中英

刪除二叉樹中的葉節點

[英]Delete a leaf node in binary tree

我正在嘗試從二進制搜索樹中刪除leaf node ,但它對我不起作用,我調試了代碼,但是我找不到問題。 我可以看到流向正確,調用到達leaf node地址,然后調用free 但是在那之后,當我執行pre-order遍歷時,我看到值仍然存在。

我創建的二叉樹(它是一個簡單的樹)-:

                           10
                         /    \
                        6      14

要刪除的Leaf Node值= 14

刪除之前Pre - order遍遍結果= 10->6->14 這被打印在我的控制台上。

刪除leaf node代碼-:

// Delete a leaf node

void deleteNode(struct Nodes * root,int value){

    // Check if root is null

    if (root == NULL) {
        return;
    }

    // If no left and right node present, it's a leaf node. Perform delete.

    while (root->left == NULL && root->right == NULL) {

        // Check if value at leaf node is same as value to be deleted. If yes, go inside (if).

        if (root->info == value) {
            printf("Delete the leaf node \n");

            printf("delete node address is \n %p",root);

            // free the root (which is currently a leaf node)
            free(root);
            return;
        }
    }

    // keep checking if value to be deleted is on right or left, till a value is found.

    if (root->info < value) {
        // Ccheck on right
        deleteNode(root->right,value);
    }else{
        // check on left
        deleteNode(root->left,value);
    }

}

我沒有任何errors ,所以我無法猜測根本原因

刪除后, Pre - order遍歷結果= 10->6->14 誰能幫我嗎? 我知道我犯了一個非常愚蠢的錯誤,或者我的概念仍然不清楚。

如果需要其他任何信息,請告訴我。

輸出圖像-:您可以看到我的值正確,並且地址相同。

在此處輸入圖片說明

free ”幾乎意味着“我發誓不再使用內存,它可能會被釋放或任意重新分配”。

你違反了那個諾言。 釋放內存后,您還必須忘記該地址上的所有引用。 父節點仍會記住該節點以前所在的地址,並且偶然地該內存尚未被回收。

您有一個典型的“免費使用后使用”錯誤。 如果您在兩者之間分配了另一個節點,則在再次遍歷之前,您會注意到內存損壞。

您可以在函數中添加另一個參數,該參數指向父對象中的指針。 這樣,您可以修改父級。

或將引用存儲回該節點中的父級。

無論哪種。

一種方法是在遞歸調用中將指針傳遞給父對象。 像這樣:

void deleteNode(struct Nodes *root, struct Nodes *parent, int value){

    // Check if root is null

    if (root == NULL) {
        return;
    }

    if ((root->info == value) && (root->left == NULL) && (root->right == NULL)) {
        if (parent->left->info == value) {free(parent->left); parent->left = NULL;}
        else {free(parent->right); parent->right = NULL;}
    }
    else if (root->info < value) {
        // check on right
        deleteNode(root->right,root, value);
    }else{
        // check on left
        deleteNode(root->left,root, value);
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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