@@ -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