1
1
package Trees ;
2
2
3
3
import java .util .*;
4
+ import static Trees .BTree .TreeNode ;
4
5
5
- public class AVL {
6
+ public class AVL < T extends Comparable < T >> extends BinarySearchTree < T > {
6
7
7
- private class AVLNode {
8
+ // heights of nodes are stored
9
+ Map <TreeNode <T >, Integer > map ;
8
10
9
- int val ;
10
- int height ;
11
- AVLNode left , right ;
12
-
13
- public AVLNode (int val ) {
14
- this .val = val ;
15
- this .height = 1 ;
16
- }
11
+ private TreeNode <T > root ;
17
12
13
+ public AVL () {
14
+ map = new HashMap <>();
18
15
}
19
- private AVLNode root ;
20
16
21
- public void add (int val ) {
17
+ @ Override
18
+ public void add (T val ) {
22
19
root = add (val , root );
23
20
}
24
21
25
- private int getHeight (AVLNode node ) {
26
- return node == null ? 0 : node . height ;
22
+ private int getHeight (TreeNode node ) {
23
+ return map . getOrDefault ( node , 0 ) ;
27
24
}
28
25
29
- private int getBalanceFactor (AVLNode node ) {
26
+ private int getBalanceFactor (TreeNode node ) {
30
27
if (node == null ) {
31
28
return 0 ;
32
29
}
33
30
return getHeight (node .left ) - getHeight (node .right );
34
31
}
35
32
36
- private AVLNode add (int val , AVLNode root ) {
37
- if (root == null ) {
38
- return new AVLNode (val );
39
- } else if (root .val > val ) {
40
- root .left = add (val , root .left );
41
- } else if (root .val < val ) {
42
- root .right = add (val , root .right );
43
- } else {
44
- return root ;
45
- }
46
- return balance (root , val );
47
- }
48
-
49
- public void remove (int val ) {
33
+ @ Override
34
+ public void remove (T val ) {
50
35
root = delete (val , root );
51
36
}
52
37
53
- private int getMin (AVLNode node ) {
38
+ private T getMin (TreeNode < T > node ) {
54
39
if (node .left == null ) {
55
40
return node .val ;
56
41
}
57
- return getMin (node .left );
42
+ return ( T ) getMin (node .left );
58
43
}
59
44
60
- public int getMin () {
45
+ @ Override
46
+ public T getMin () {
61
47
return getMin (root );
62
48
}
63
49
64
- private AVLNode delete (int val , AVLNode node ) {
50
+ private TreeNode < T > delete (T val , TreeNode < T > node ) {
65
51
if (node == null ) {
66
52
return null ;
67
53
}
68
- if (node .val > val ) {
54
+ if (node .val . compareTo ( val ) > 0 ) {
69
55
node .left = delete (val , node .left );
70
- } else if (node .val < val ) {
56
+ } else if (node .val . compareTo ( val ) < 0 ) {
71
57
node .right = delete (val , node .right );
72
58
} else {
73
59
if (node .left == null && node .right != null ) {
74
60
return node .right ;
75
61
} else if (node .left != null && node .right == null ) {
76
62
return node .left ;
77
63
} else if (node .left != null && node .right != null ) {
78
- int min = getMin (node .right );
64
+ T min = ( T ) getMin (node .right );
79
65
node .val = min ;
80
66
node .right = delete (min , node .right );
81
67
return node ;
@@ -86,61 +72,132 @@ private AVLNode delete(int val, AVLNode node) {
86
72
return balance (node , val );
87
73
}
88
74
89
- private AVLNode balance (AVLNode node , int val ) {
90
- node .height = 1 + Math .max (getHeight (node .left ), getHeight (node .right ));
75
+ private TreeNode <T > add (T val , TreeNode < T > root ) {
76
+ if (root == null ) {
77
+ TreeNode <T > temp = new TreeNode (val );
78
+ map .put (temp , 1 );
79
+ return temp ;
80
+ } else if (root .compareTo (val ) > 0 ) {
81
+ root .left = add (val , root .left );
82
+ } else if (root .compareTo (val ) < 0 ) {
83
+ root .right = add (val , root .right );
84
+ } else {
85
+ return root ;
86
+ }
87
+ return balance (root , val );
88
+ }
89
+
90
+ private TreeNode <T > balance (TreeNode <T > node , T val ) {
91
+ map .put (node , 1 + Math .max (getHeight (node .left ), getHeight (node .right )));
91
92
int balanceFactor = getBalanceFactor (node );
92
93
if (balanceFactor > 1 ) {
93
- if (val < node .left . val ) {
94
+ if (node .compareTo ( val ) > 0 ) {
94
95
return rightRotate (node );
95
- } else if (val > node .left . val ) {
96
+ } else if (node .compareTo ( val ) < 0 ) {
96
97
node .left = leftRotate (node .left );
97
98
return rightRotate (node );
98
99
}
99
100
}
100
101
if (balanceFactor < -1 ) {
101
- if (val > node .right . val ) {
102
+ if (node .compareTo ( val ) < 0 ) {
102
103
return leftRotate (node );
103
- } else if (val < node .right . val ) {
104
+ } else if (node .compareTo ( val ) > 0 ) {
104
105
node .right = rightRotate (node .right );
105
106
return leftRotate (node );
106
107
}
107
108
}
108
109
return node ;
109
110
}
110
111
111
- private AVLNode leftRotate (AVLNode node ) {
112
- AVLNode temp = node .right ;
113
- AVLNode x = temp .left ;
112
+ private TreeNode < T > leftRotate (TreeNode < T > node ) {
113
+ TreeNode < T > temp = node .right ;
114
+ TreeNode < T > x = temp .left ;
114
115
temp .left = node ;
115
116
node .right = x ;
116
- temp . height = 1 + Math .max (getHeight (temp .left ), getHeight (temp .right ));
117
- node . height = 1 + Math .max (getHeight (node .left ), getHeight (node .right ));
117
+ map . put ( temp , 1 + Math .max (getHeight (temp .left ), getHeight (temp .right ) ));
118
+ map . put ( node , 1 + Math .max (getHeight (node .left ), getHeight (node .right ) ));
118
119
return temp ;
119
120
}
120
121
121
- private AVLNode rightRotate (AVLNode node ) {
122
- AVLNode temp = node .left ;
123
- AVLNode y = temp .right ;
122
+ private TreeNode < T > rightRotate (TreeNode < T > node ) {
123
+ TreeNode < T > temp = node .left ;
124
+ TreeNode < T > y = temp .right ;
124
125
temp .right = node ;
125
126
node .left = y ;
126
- temp . height = 1 + Math .max (getHeight (temp .left ), getHeight (temp .right ));
127
- node . height = 1 + Math .max (getHeight (node .left ), getHeight (node .right ));
127
+ map . put ( temp , 1 + Math .max (getHeight (temp .left ), getHeight (temp .right ) ));
128
+ map . put ( node , 1 + Math .max (getHeight (node .left ), getHeight (node .right ) ));
128
129
return temp ;
129
130
}
130
131
131
- public List <Object > inOrder () {
132
- return inOrder (root );
132
+ @ Override
133
+ public boolean contains (T val ) {
134
+ return contains (val , root );
133
135
}
134
136
135
- private List < Object > inOrder ( AVLNode node ) {
137
+ private boolean contains ( T val , TreeNode node ) {
136
138
if (node == null ) {
137
- return new ArrayList <>() ;
139
+ return false ;
138
140
}
139
- List <Object > ans = new ArrayList <>();
140
- ans .addAll (inOrder (node .left ));
141
- ans .add (node .val );
142
- ans .addAll (inOrder (node .right ));
143
- return ans ;
141
+ if (node .compareTo (val ) == 0 ) {
142
+ return true ;
143
+ }
144
+ return contains (val , node .left ) || contains (val , node .right );
145
+ }
146
+
147
+ @ Override
148
+ public List <Object > inOrder () {
149
+ return super .inOrder (root );
150
+ }
151
+
152
+ @ Override
153
+ public List <Object > preOrder () {
154
+ return super .preOrder (root );
155
+ }
156
+
157
+ @ Override
158
+ public List <Object > postOrder () {
159
+ return super .postOrder (root );
160
+ }
161
+
162
+ @ Override
163
+ public List <List <Object >> levelOrder () {
164
+ return super .levelOrder (root );
165
+ }
166
+
167
+ @ Override
168
+ public List <Object > leftView () {
169
+ return super .leftView (root );
170
+ }
171
+
172
+ @ Override
173
+ public List <Object > rightView () {
174
+ return super .rightView (root );
175
+ }
176
+
177
+ @ Override
178
+ public List <Object > topView () {
179
+ return super .topView (root );
180
+ }
181
+
182
+ @ Override
183
+ public List <Object > botttomView () {
184
+ return super .botttomView (root );
185
+ }
186
+
187
+ @ Override
188
+ public int height () {
189
+ return super .height (root );
190
+ }
191
+
192
+ @ Override
193
+ public int size () {
194
+ return map .size ();
195
+ }
196
+
197
+ @ Override
198
+ public void clear () {
199
+ root = null ;
200
+ map .clear ();
144
201
}
145
202
146
203
@ Override
0 commit comments