@@ -33,90 +33,59 @@ public void add( E data ) {
33
33
}
34
34
}
35
35
36
- public boolean find ( E data ) {
37
- return find ( data , root );
36
+ public boolean contains ( E data ) {
37
+ return contains ( data , root );
38
38
}
39
39
40
- private boolean find ( E data , Node root ) {
40
+ private boolean contains ( E data , Node root ) {
41
41
if ( root == null ) {
42
42
return false ;
43
43
}
44
44
if ( root .data == data ) {
45
45
return true ;
46
46
}
47
47
if ( data .compareTo ( root .data ) < 0 ) {
48
- return find ( data , root .left );
48
+ return contains ( data , root .left );
49
49
} else {
50
- return find ( data , root .right );
50
+ return contains ( data , root .right );
51
51
}
52
52
}
53
53
54
54
public boolean remove ( E data ) {
55
- if ( root .data == data ) {
56
- return false ;
57
- }
58
- Node parent = findParent ( root , data );
59
- if ( parent == null ) {
60
- return false ;
61
- }
62
- Node current ;
63
- if ( parent .left != null && parent .left .data == data ) {
64
- current = parent .left ;
65
- } else {
66
- current = parent .right ;
67
- }
68
- remove ( parent , current );
69
- return true ;
55
+ final boolean isPresent = contains ( data );
56
+ root = remove ( root , data );
57
+ return isPresent ;
70
58
}
71
59
72
- private void remove ( Node parent , Node current ) {
73
- if ( current .isLeaf () ) {
74
- if ( parent .left == current ) {
75
- parent .left = null ;
76
- } else {
77
- parent .right = null ;
78
- }
79
- return ;
60
+ private Node remove ( Node root , E data ) {
61
+ // If tree is not empty
62
+ if ( root == null ) {
63
+ return null ;
80
64
}
81
- if ( current .left == null ) {
82
- if ( parent .left == current ) {
83
- parent .left = current .right ;
84
- } else {
85
- parent .right = current .right ;
65
+
66
+ if ( data .compareTo ( root .data ) < 0 ) {
67
+ root .left = remove ( root .left , data );
68
+ } else if ( data .compareTo ( root .data ) > 0 ) {
69
+ root .right = remove ( root .right , data );
70
+ } else {
71
+ if ( root .left == null ) {
72
+ return root .right ;
86
73
}
87
- return ;
88
- }
89
- if ( current .right == null ) {
90
- if ( parent .left == current ) {
91
- parent .left = current .left ;
92
- } else {
93
- parent .right = current .left ;
74
+ if ( root .right == null ) {
75
+ return root .left ;
94
76
}
95
- return ;
96
- }
97
- Node itr = current .right ;
98
- parent = current ;
99
- while ( itr .left != null ) {
100
- parent = itr ;
101
- itr = itr .left ;
77
+ //Element found
78
+ root .data = minValue ( root .right );
79
+ root .right = remove ( root .right , root .data );
102
80
}
103
- current .data = itr .data ;
104
- remove ( parent , itr );
81
+ return root ;
105
82
}
106
83
107
- private Node findParent ( Node current , E data ) {
108
- if ( current == null || current .data == data ) {
109
- return null ;
110
- }
111
- if ( current .left != null && current .left .data == data ) {
112
- return current ;
113
- } else if ( current .right != null && current .right .data == data ) {
114
- return current ;
115
- } else if ( data .compareTo ( current .data ) < 0 ) {
116
- return findParent ( current .left , data );
117
- } else {
118
- return findParent ( current .right , data );
84
+ private E minValue ( Node root ) {
85
+ while ( root .left != null ) {
86
+ root = root .left ;
119
87
}
88
+ return root .data ;
120
89
}
121
90
122
91
private class Node {
0 commit comments