I am trying to remove nodes from a binary search tree. I can successfully delete any other node in the tree, except for one specific case. If the target node has 2 children and the left child has the correct subtree, I can find the correct node replacement and switch the value to the target Node, but then the node replacement will never be deleted.

If you look at the picture above, if I try to delete 17, the program will correctly move to 13 and replace 17 with 13, but it will not delete the original 13, as expected.
I have attached my removal methods and those referenced internally.
public Node root;
public void delete(int value){
Node node = new Node<>(value);
Node temp;
if(root == null) {
System.out.println("The tree is already empty!");
return;
}
if (root.value == node.value) {
temp = node.left;
if(temp.right == null){
node.value = temp.value;
temp = null;
}
else{
while(temp.right != null){
temp = temp.right;
}
node.value = temp.value;
temp = null;
}
return;
}
deleteRec(root, node);
}
private void deleteRec(Node lastRoot, Node node){
Node temp;
if (lastRoot.value >= node.value){
if (lastRoot.left.value == node.value){
node = lastRoot.left;
if(node.left == null && node.right == null){
node = null;
lastRoot.left = null;
}
else if(node.left == null && node.right != null){
lastRoot.left = node.right;
node = null;
lastRoot.left = null;
}
else if(node.left != null && node.right == null){
lastRoot.left = node.left;
node = null;
}
else{
if(node.left.right == null){
node.value = node.left.value;
node.left = node.left.left;
node.left = null;
}
else{
node = findReplacement(node.left);
lastRoot.left.value = node.value;
node.left = null;
}
}
}
else{
deleteRec(lastRoot.left, node);
}
}
else{
if (lastRoot.right.value == node.value){
node = lastRoot.right;
if(node.left == null && node.right == null){
node = null;
lastRoot.right = null;
}
else if(node.left == null && node.right != null){
lastRoot.left = node.right;
node = null;
lastRoot.right = null;
}
else if(node.left != null && node.right == null){
lastRoot.right = node.left;
node = null;
}
else{
if(node.left.right == null){
node.value = node.left.value;
node.left = node.left.left;
node.left = null;
}
else{
node = findReplacement(node.left);
lastRoot.left.value = node.value;
node.left = null;
}
}
}
else{
deleteRec(lastRoot.right, node);
}
}
}
private Node findReplacement(Node node) {
while(node.right != null){
node = node.right;
}
return node;
}
And here is my node class:
public class Node<T> {
public int value;
public Node left;
public Node right;
public Node parent;
public Node(int value) {
this.value = value;
}
}
source
share