Skip to content

Commit 7acbc79

Browse files
committed
recursived deletion binary tree
1 parent 9ead70b commit 7acbc79

1 file changed

Lines changed: 28 additions & 83 deletions

File tree

core-java/src/main/java/com/baeldung/tree/BinaryTree.java

Lines changed: 28 additions & 83 deletions
Original file line numberDiff line numberDiff line change
@@ -58,89 +58,51 @@ private boolean containsNodeRecursive(Node current, int value) {
5858
}
5959

6060
public void delete(int value) {
61+
deleteRecursive(root, value);
62+
}
6163

62-
NodeVO nodeToDeleteVO = findNodeToDelete(root, root, false, value);
63-
64-
if (nodeToDeleteVO == null) {
65-
return;
64+
private Node deleteRecursive(Node current, int value) {
65+
if (current == null) {
66+
return null;
6667
}
6768

68-
// Case 1: no children
69-
if (nodeToDeleteVO.node.left == null && nodeToDeleteVO.node.right == null) {
70-
if (nodeToDeleteVO.node == root) {
71-
root = null;
72-
} else if (nodeToDeleteVO.isLeftChild) {
73-
nodeToDeleteVO.parent.left = null;
74-
} else {
75-
nodeToDeleteVO.parent.right = null;
76-
}
77-
}
78-
// Case 2: only 1 child
79-
else if (nodeToDeleteVO.node.right == null) {
80-
if (nodeToDeleteVO.node == root) {
81-
root = nodeToDeleteVO.node.left;
82-
} else if (nodeToDeleteVO.isLeftChild) {
83-
nodeToDeleteVO.parent.left = nodeToDeleteVO.node.left;
84-
} else {
85-
nodeToDeleteVO.parent.right = nodeToDeleteVO.node.left;
86-
}
87-
} else if (nodeToDeleteVO.node.left == null) {
88-
if (nodeToDeleteVO.node == root) {
89-
root = nodeToDeleteVO.node.right;
90-
} else if (nodeToDeleteVO.isLeftChild) {
91-
nodeToDeleteVO.parent.left = nodeToDeleteVO.node.right;
92-
} else {
93-
nodeToDeleteVO.parent.right = nodeToDeleteVO.node.right;
69+
if (value == current.value) {
70+
// Case 1: no children
71+
if (current.left == null && current.right == null) {
72+
return null;
9473
}
95-
}
96-
// Case 3: 2 children
97-
else if (nodeToDeleteVO.node.left != null && nodeToDeleteVO.node.right != null) {
98-
Node replacement = findReplacement(nodeToDeleteVO.node);
99-
if (nodeToDeleteVO.node == root) {
100-
root = replacement;
101-
} else if (nodeToDeleteVO.isLeftChild) {
102-
nodeToDeleteVO.parent.left = replacement;
103-
} else {
104-
nodeToDeleteVO.parent.right = replacement;
74+
75+
// Case 2: only 1 child
76+
if (current.right == null) {
77+
return current.left;
10578
}
106-
}
10779

108-
}
80+
if (current.left == null) {
81+
return current.right;
82+
}
10983

110-
private NodeVO findNodeToDelete(Node current, Node parent, boolean isLeftChild, int value) {
84+
// Case 3: 2 children
85+
int smallestValue = findSmallestNode(current.right);
86+
current.value = smallestValue;
87+
current.right = deleteRecursive(current.right, smallestValue);
88+
return current;
11189

112-
if (current == null) {
113-
return null;
114-
} else if (value == current.value) {
115-
return new NodeVO(current, parent, isLeftChild);
11690
} else if (value < current.value) {
117-
return findNodeToDelete(current.left, current, true, value);
91+
current.left = deleteRecursive(current.left, value);
92+
return current;
11893
} else {
119-
return findNodeToDelete(current.right, current, false, value);
94+
current.right = deleteRecursive(current.right, value);
95+
return current;
12096
}
12197
}
12298

123-
private Node findReplacement(Node nodeToDelete) {
124-
125-
NodeVO replacementNodeVO = findSmallestNode(nodeToDelete, nodeToDelete);
126-
127-
if (replacementNodeVO.node != nodeToDelete.right) {
128-
replacementNodeVO.parent.left = replacementNodeVO.node.right;
129-
replacementNodeVO.node.right = nodeToDelete.right;
130-
}
131-
132-
replacementNodeVO.node.left = nodeToDelete.left;
133-
134-
return replacementNodeVO.node;
135-
}
136-
137-
private NodeVO findSmallestNode(Node root, Node parent) {
99+
private int findSmallestNode(Node root) {
138100

139101
if (root.left == null) {
140-
return new NodeVO(root, parent);
102+
return root.value;
141103
}
142104

143-
return findSmallestNode(root.left, root);
105+
return findSmallestNode(root.left);
144106
}
145107

146108
public void traverseInOrder(Node node) {
@@ -188,23 +150,6 @@ public void traverseLevelOrder() {
188150
}
189151
}
190152

191-
class NodeVO {
192-
Node node;
193-
Node parent;
194-
boolean isLeftChild;
195-
196-
NodeVO(Node node, Node parent) {
197-
this.node = node;
198-
this.parent = parent;
199-
}
200-
201-
NodeVO(Node node, Node parent, boolean isLeftChild) {
202-
this.node = node;
203-
this.parent = parent;
204-
this.isLeftChild = isLeftChild;
205-
}
206-
}
207-
208153
class Node {
209154
int value;
210155
Node left;

0 commit comments

Comments
 (0)