簡體   English   中英

刪除BST中的節點(2)

[英]Delete Node in BST (2)

我有BST,當我想從BST刪除節點時,什么也沒發生。 有人可以解釋為什么嗎?

這是我的代碼:

private void delete(int value, Node node) {
    if (value<node.value) delete(value, node.left);
    else if (value> node.value)
        delete(value, node.right);
    else {
        if (node.left != null && node.right != null) {
            int maxFromLeft = findMax(node.left);
            node.value = maxFromLeft;
            delete(maxFromLeft, node.left);
        } else if (node.left != null) {
            Node trash = node;
            node = node.left;
            trash = null;
        } else if (node.right != null) {
            Node trash = node;
            node = node.right;
            trash = null;
        } else {
            node = null;
        }
    }
}

考慮這部分

if (node.left != null) {
 Node trash = node;
 node = node.left;
 trash = null;
}

您需要刪除node 這什么也不做node = node.left 它只是將一個引用分配給另一個引用。 這不需要太trash = null

要刪除節點,您需要先斷開其與父節點的連接,然后將已刪除節點的一​​個子節點連接到父節點,然后將其他子節點插入該節點!

簽名為void delete(int,Node)方法無法工作。 請考慮當您嘗試從僅具有一個節點的樹中刪除根節點時會發生什么:該方法無法刪除該節點,因為方法參數是通過值傳遞的。

您可以從此方法返回修改后的BST:

Node delete(int value, Node node) {
    if (value<node.value) node.left = delete(value, node.left);
    else if (value> node.value)
        node.right = delete(value, node.right);
    ...I'll leave the rest as an exercise...
    return node;
}

暫無
暫無

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

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