Skip to content

Commit 15bc324

Browse files
committed
binary tree changed to follow a recursive approach
1 parent a91c665 commit 15bc324

1 file changed

Lines changed: 92 additions & 89 deletions

File tree

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

Lines changed: 92 additions & 89 deletions
Original file line numberDiff line numberDiff line change
@@ -16,145 +16,131 @@ public void add(int value) {
1616
return;
1717
}
1818

19-
Node parent = root;
20-
Node current = root;
19+
addRecursive(root, value);
20+
}
2121

22-
while (true) {
22+
private Node addRecursive(Node current, int value) {
2323

24-
if (newNode.value < parent.value) {
25-
current = parent.left;
24+
if (current == null) {
25+
return new Node(value);
26+
}
2627

27-
if (current == null) {
28-
parent.left = newNode;
29-
break;
30-
}
31-
} else {
32-
current = parent.right;
28+
if (value < current.value) {
29+
current.left = addRecursive(current.left, value);
30+
} else {
31+
current.right = addRecursive(current.right, value);
32+
}
3333

34-
if (current == null) {
35-
parent.right = newNode;
36-
break;
37-
}
38-
}
34+
return current;
3935

40-
parent = current;
41-
}
4236
}
4337

4438
public boolean isEmpty() {
4539
return root == null;
4640
}
4741

4842
public boolean containsNode(int value) {
43+
return containsNodeRecursive(root, value);
44+
}
4945

50-
Node current = root;
51-
52-
while (current != null) {
53-
54-
if (value == current.value) {
55-
return true;
56-
}
57-
58-
if (value < current.value) {
59-
current = current.left;
60-
} else {
61-
current = current.right;
62-
}
46+
private boolean containsNodeRecursive(Node current, int value) {
6347

48+
if (current == null) {
49+
return false;
50+
} else if (value == current.value) {
51+
return true;
52+
} else if (value < current.value) {
53+
return containsNodeRecursive(current.left, value);
54+
} else {
55+
return containsNodeRecursive(current.right, value);
6456
}
6557

66-
return false;
6758
}
6859

6960
public void delete(int value) {
7061

71-
Node current = root;
72-
Node parent = root;
73-
Node nodeToDelete = null;
74-
boolean isLeftChild = false;
75-
76-
while (nodeToDelete == null && current != null) {
77-
78-
if (value == current.value) {
79-
nodeToDelete = current;
80-
} else if (value < current.value) {
81-
parent = current;
82-
current = current.left;
83-
isLeftChild = true;
84-
} else {
85-
parent = current;
86-
current = current.right;
87-
isLeftChild = false;
88-
}
89-
90-
}
62+
NodeVO nodeToDeleteAux = findNodeToDelete(root, root, false, value);
9163

92-
if (nodeToDelete == null) {
64+
if (nodeToDeleteAux == null) {
9365
return;
9466
}
9567

9668
// Case 1: no children
97-
if (nodeToDelete.left == null && nodeToDelete.right == null) {
98-
if (nodeToDelete == root) {
69+
if (nodeToDeleteAux.node.left == null && nodeToDeleteAux.node.right == null) {
70+
if (nodeToDeleteAux.node == root) {
9971
root = null;
100-
} else if (isLeftChild) {
101-
parent.left = null;
72+
} else if (nodeToDeleteAux.isLeftChild) {
73+
nodeToDeleteAux.parent.left = null;
10274
} else {
103-
parent.right = null;
75+
nodeToDeleteAux.parent.right = null;
10476
}
10577
}
10678
// Case 2: only 1 child
107-
else if (nodeToDelete.right == null) {
108-
if (nodeToDelete == root) {
109-
root = nodeToDelete.left;
110-
} else if (isLeftChild) {
111-
parent.left = nodeToDelete.left;
79+
else if (nodeToDeleteAux.node.right == null) {
80+
if (nodeToDeleteAux.node == root) {
81+
root = nodeToDeleteAux.node.left;
82+
} else if (nodeToDeleteAux.isLeftChild) {
83+
nodeToDeleteAux.parent.left = nodeToDeleteAux.node.left;
11284
} else {
113-
parent.right = nodeToDelete.left;
85+
nodeToDeleteAux.parent.right = nodeToDeleteAux.node.left;
11486
}
115-
} else if (nodeToDelete.left == null) {
116-
if (nodeToDelete == root) {
117-
root = nodeToDelete.right;
118-
} else if (isLeftChild) {
119-
parent.left = nodeToDelete.right;
87+
} else if (nodeToDeleteAux.node.left == null) {
88+
if (nodeToDeleteAux.node == root) {
89+
root = nodeToDeleteAux.node.right;
90+
} else if (nodeToDeleteAux.isLeftChild) {
91+
nodeToDeleteAux.parent.left = nodeToDeleteAux.node.right;
12092
} else {
121-
parent.right = nodeToDelete.right;
93+
nodeToDeleteAux.parent.right = nodeToDeleteAux.node.right;
12294
}
12395
}
12496
// Case 3: 2 children
125-
else if (nodeToDelete.left != null && nodeToDelete.right != null) {
126-
Node replacement = findReplacement(nodeToDelete);
127-
if (nodeToDelete == root) {
97+
else if (nodeToDeleteAux.node.left != null && nodeToDeleteAux.node.right != null) {
98+
Node replacement = findReplacement(nodeToDeleteAux.node);
99+
if (nodeToDeleteAux.node == root) {
128100
root = replacement;
129-
} else if (isLeftChild) {
130-
parent.left = replacement;
101+
} else if (nodeToDeleteAux.isLeftChild) {
102+
nodeToDeleteAux.parent.left = replacement;
131103
} else {
132-
parent.right = replacement;
104+
nodeToDeleteAux.parent.right = replacement;
133105
}
134106
}
135107

136108
}
137109

110+
private NodeVO findNodeToDelete(Node current, Node parent, boolean isLeftChild, int value) {
111+
112+
if (current == null) {
113+
return null;
114+
} else if (value == current.value) {
115+
return new NodeVO(current, parent, isLeftChild);
116+
} else if (value < current.value) {
117+
return findNodeToDelete(current.left, current, true, value);
118+
} else {
119+
return findNodeToDelete(current.right, current, false, value);
120+
}
121+
}
122+
138123
private Node findReplacement(Node nodeToDelete) {
139124

140-
Node replacement = nodeToDelete;
141-
Node parentReplacement = nodeToDelete;
142-
Node current = nodeToDelete.right;
125+
NodeVO replacementNodeVO = findSmallestNode(nodeToDelete, nodeToDelete);
143126

144-
while (current != null) {
145-
parentReplacement = replacement;
146-
replacement = current;
147-
current = current.left;
127+
if (replacementNodeVO.node != nodeToDelete.right) {
128+
replacementNodeVO.parent.left = replacementNodeVO.node.right;
129+
replacementNodeVO.node.right = nodeToDelete.right;
148130
}
149131

150-
if (replacement != nodeToDelete.right) {
151-
parentReplacement.left = replacement.right;
152-
replacement.right = nodeToDelete.right;
153-
}
132+
replacementNodeVO.node.left = nodeToDelete.left;
133+
134+
return replacementNodeVO.node;
135+
}
154136

155-
replacement.left = nodeToDelete.left;
137+
private NodeVO findSmallestNode(Node root, Node parent) {
156138

157-
return replacement;
139+
if (root.left == null) {
140+
return new NodeVO(root, parent);
141+
}
142+
143+
return findSmallestNode(root.left, root);
158144
}
159145

160146
public void traverseInOrder(Node node) {
@@ -202,6 +188,23 @@ public void traverseLevelOrder() {
202188
}
203189
}
204190

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+
205208
class Node {
206209
int value;
207210
Node left;

0 commit comments

Comments
 (0)