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