簡體   English   中英

如何從二叉搜索樹中刪除節點

[英]How do I delete a node from a binary search tree

如何實現從二進制搜索樹中刪除節點的功能? 下面是我當前的功能:

    void makeDeletion(TreeNode *&tree) {
    TreeNode *NodeToDelete;
    NodeToDelete = tree;
    TreeNode *InOrder;

    if (tree->right == NULL && tree->left == NULL) {
        delete NodeToDelete;
    }
    if (tree->right == NULL) {
        tree = tree->left;
        delete NodeToDelete;
    }
    else if (tree->left == NULL) {
        tree = tree->right;
        delete NodeToDelete;
    }
    else {
        InOrder = tree->right;
        while (InOrder->left != NULL) {
            InOrder = InOrder->left; 
        }

        NodeToDelete->value = InOrder->value;
        remove(InOrder, InOrder->value);
    }
}

這是我具有的remove功能,用於定位要刪除的值:

    void remove(TreeNode *&tree, ANY num) {//Removed Need for ">"
    if (tree == NULL){
        return;
    }

    if (tree->value == num) {
        makeDeletion(tree);
    } else if (num < tree->value) {
        remove(tree->left, num);
    } else {
        remove(tree->right, num);
    }
};//Remove

就目前而言,我感覺自己已經很接近了,但是當我輸出二進制樹的內容時,程序崩潰了。 我正在嘗試使用一種方法,如果該節點有兩個孩子,則找到順序繼承者,交換順序繼承者和要“刪除”的節點的節點值,然后刪除順序繼承者。 如果不調整remove函數,那么使makeDeletion函數如所描述的makeDeletion工作,我會丟失什么信息?

編輯:在makeDeletion函數中,我錯誤地連續寫了兩個if語句。 第二個if語句應該是else if語句。

makeDeletion ,如果tree是葉(包括leftrightNULL ),你刪除葉節點,並且不設置tree = nullptr 這會將懸空的引用留在樹中,以釋放已釋放的內存。 另外,然后在下一個if取消引用(現在已刪除)節點。 其中任何一種都可能導致崩潰。

暫無
暫無

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

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