删除BST中的节点(2)

时间:2016-04-15 06:40:32

标签: java recursion binary-search-tree

我有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;
        }
    }
}

2 个答案:

答案 0 :(得分:1)

考虑这部分

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

您需要删除node。这没有任何作用node = node.left。它只是将一个引用分配给另一个引用。这个dosn也需要trash = null

要删除节点,首先需要将其与父节点断开连接,并将已删除节点的一​​个子节点连接到父节点,并插入其他子节点。

答案 1 :(得分:0)

签名为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;
}