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